Можно ли определить вызываемую концепцию, включающую функции и лямбды? ⇐ 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 является лямбда-выражением?
Есть ли лучшее решение для того, чего я пытаюсь достичь?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Log4net не может настроить библиотеку классов .NET, вызываемую из Win32 exe
Anonymous » » в форуме C# - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Могу ли я назначить вызываемую функцию std::function с другим типом возвращаемого значения?
Anonymous » » в форуме C++ - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-