Я хочу определить концепцию, которая будет принимать все вызываемые объекты. Вот что я сделал до сих пор:
template<typename F>
concept Func = std::is_function_v<std::remove_pointer_t<std::decay_t<F>>> || (requires (F f) {
std::is_function_v<decltype(f.operator())>;
});
bool is_callable(Func auto&&) {
return true;
}
bool is_callable(auto&&) {
return false;
}
Тем не менее, если я определю их:
auto f = [](auto a, auto b, auto c, auto d, auto e) {
return a * b * c * d * e;
};
int g(int a, int b) {
return a + b;
}
is_callable(g)
это true
, а is_callable(f)
это false
, это не сработало (хочу, чтобы оба возвращали true
).
Поэтому я попытался посмотреть, будет ли компилироваться следующее:
decltype(f.operator()) // Reference to non-static member function must be called
decltype(&f.operator()) // Cannot create a non-constant pointer to member function
decltype(f::operator()) // 'f' is not a class, namespace, or enumeration
decltype(&f::operator()) // same as previously
Это дало мне ошибки, которые вы можете увидеть как комментарий к этим 4 строкам.
Есть ли способ проверить, имеет ли f действительный функтор, который будет означать, что f является лямбдой?
Есть ли лучшее решение для того, чего я пытаюсь достичь?
is_callable
функцией, а не просто самой концепцией? - person Nicol Bolas   schedule 06.05.2020curry(f)(1, 2)()(3)(4, 5)
да, в конце концов он будет вызываться с аргументами, и в конце концов я вызываю f со всеми аргументами, это не удастся, если f нельзя вызывать да. Мне просто интересно, могу ли я создать концепцию, чтобы сделать ее более строгой и отображать более качественные сообщения об ошибках (что, я думаю, является частью того, почему концепции существуют). Даже если это не очень полезно, я хотел бы знать, возможно это или невозможно. - person titarch   schedule 06.05.2020curry(f)
, как результирующий функтор карри узнает, чтоf
принимает 5 аргументов? - person Nicol Bolas   schedule 06.05.2020