Можно ли определить вызываемую концепцию, включающую функции и лямбды? ⇐ C++
-
Гость
Можно ли определить вызываемую концепцию, включающую функции и лямбды?
Я хочу определить концепцию, которая будет принимать все вызываемые объекты. Вот что я сделал на данный момент:
шаблон концепция Func = std::is_function_v || (требуется (F f) { std::is_function_v; }); bool is_callable(Func auto&&) { вернуть истину; } bool is_callable(авто&&) { вернуть ложь; } Тем не менее, если я определяю их:
auto f = [](auto a, auto b, auto c, auto d, auto e) { вернуть a * b * c * d * e; }; int g(int a, int b) { вернуть а + б; } is_callable(g) имеет значение true, но is_callable(f) имеет значение false, это не сработало ( Я хочу, чтобы оба возвращали true).
Поэтому я попытался посмотреть, скомпилируется ли следующее:
decltype(f.operator()) // Необходимо вызвать ссылку на нестатическую функцию-член decltype(&f.operator()) // Невозможно создать непостоянный указатель на функцию-член decltype(f::operator()) // 'f' не является классом, пространством имен или перечислением decltype(&f::operator()) // то же, что и раньше Это дало мне ошибки, которые вы можете увидеть в комментариях к этим 4 строкам.
Есть ли способ проверить, имеет ли f действительный функтор, который будет означать, что f является лямбда-выражением?
Есть ли лучшее решение для того, чего я пытаюсь достичь?
Я хочу определить концепцию, которая будет принимать все вызываемые объекты. Вот что я сделал на данный момент:
шаблон концепция Func = std::is_function_v || (требуется (F f) { std::is_function_v; }); bool is_callable(Func auto&&) { вернуть истину; } bool is_callable(авто&&) { вернуть ложь; } Тем не менее, если я определяю их:
auto f = [](auto a, auto b, auto c, auto d, auto e) { вернуть a * b * c * d * e; }; int g(int a, int b) { вернуть а + б; } is_callable(g) имеет значение true, но is_callable(f) имеет значение false, это не сработало ( Я хочу, чтобы оба возвращали true).
Поэтому я попытался посмотреть, скомпилируется ли следующее:
decltype(f.operator()) // Необходимо вызвать ссылку на нестатическую функцию-член decltype(&f.operator()) // Невозможно создать непостоянный указатель на функцию-член decltype(f::operator()) // 'f' не является классом, пространством имен или перечислением decltype(&f::operator()) // то же, что и раньше Это дало мне ошибки, которые вы можете увидеть в комментариях к этим 4 строкам.
Есть ли способ проверить, имеет ли f действительный функтор, который будет означать, что f является лямбда-выражением?
Есть ли лучшее решение для того, чего я пытаюсь достичь?
Мобильная версия