如何理解is_callable的定义?
How to understand is_callable definition?
在ISO C++标准规范N4606草案的§20.15.6中,is_callable
定义如下:
template <class Fn, class...ArgTypes, class R>
struct is_callable<Fn(ArgTypes...), R>
The expression INVOKE(declval<Fn>(),declval<ArgTypes>()...,R)
is well formed when treated as an unevaluated operand.
据我了解 Fn(ArgTypes...)
是一个函数的签名 returning 一个 Fn
并作为参数 ArgTypes...
.
所以INVOKE(declval<Fn>(),...)
会尝试调用函数的return值??
那么is_callable
的目标是什么?或者我哪里弄错了?
根据我的理解,std::is_callable
将回答以下问题:是否可以使用 ArgTypes...
的实例作为参数调用 Fn
的实例,以及此调用是否会导致 R
类型。
举个例子:
#include <type_traits>
struct A {
int operator()(int, float, double) { return 0; }
};
int main() {
static_assert(std::is_callable<A(int, float, double), int>::value, "!");
static_assert(!std::is_callable<A(int, int), int>::value, "!!");
}
在ISO C++标准规范N4606草案的§20.15.6中,is_callable
定义如下:
template <class Fn, class...ArgTypes, class R> struct is_callable<Fn(ArgTypes...), R>
The expression
INVOKE(declval<Fn>(),declval<ArgTypes>()...,R)
is well formed when treated as an unevaluated operand.
据我了解 Fn(ArgTypes...)
是一个函数的签名 returning 一个 Fn
并作为参数 ArgTypes...
.
所以INVOKE(declval<Fn>(),...)
会尝试调用函数的return值??
那么is_callable
的目标是什么?或者我哪里弄错了?
根据我的理解,std::is_callable
将回答以下问题:是否可以使用 ArgTypes...
的实例作为参数调用 Fn
的实例,以及此调用是否会导致 R
类型。
举个例子:
#include <type_traits>
struct A {
int operator()(int, float, double) { return 0; }
};
int main() {
static_assert(std::is_callable<A(int, float, double), int>::value, "!");
static_assert(!std::is_callable<A(int, int), int>::value, "!!");
}