Выведите лямбда-тип лямбда-функции в указатель на функцию - PullRequest
0 голосов
/ 09 января 2019

Итак, я сделал этот шаблон для определения встроенных функторов:

template <typename F, F* f>
struct AsFunctor
{
    template <typename... Args>
    std::invoke_result_t<F, Args...> operator()(Args&&... args) { return f(std::forward<Args>(args)...); }
};

, который можно использовать так:

std::unique_ptr<char, AsFunctor<void(char*), +[](char* c) {/*STUFF*/}>> p;

Прекрасно работает, за исключением того, что мне приходится без необходимости объявлять тип моей функции дважды. Есть ли способ, которым я могу заставить компилятор выводить это? Я пробовал decltype различными способами, такими как

#define AS_FUNCTOR(lambda) AsFunctor<decltype(+lambda), +lambda>

но это все ошибки компиляции, поскольку лямбды не могут отображаться в неоцененном контексте.

1 Ответ

0 голосов
/ 09 января 2019

Вы можете использовать auto для функтора, а затем decltype для определения типа.

template <auto F>
struct AsFunctor {
  template <typename... Args>
  std::invoke_result_t<decltype(F), Args...> operator()(Args&&... args) {
    return F(std::forward<Args>(args)...);
  }
};

int main() {
  int i;
  std::unique_ptr<char, AsFunctor<+[](char* c) { /*STUFF*/ }>> p;
}

Я не знаю контекста, но обычно вам не нужны никакие пользовательские типы функторов (лучше сразу использовать шаблоны, посмотрите на любой пример из STL) или std::function.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...