我已经在库实现中看到了这个表达式,我基本上理解它已用于培养SFINAE甚至用于提取static_assert
触发器。
它基本上采用以下形式:
template <typename>
char (&checkValid(...))[2];
template <typename T>
char checkValid(e); where e is an expression(using type T) results in type X
如果e
格式正确,那么结果将是(假设使用sizeof
)1 else 2并且可以应用于:
static_assert(sizeof(checkValid<T>(0))==1,"") ;
前几天我以不同的方式做了类似的事情:
using namespace std;
template<typename...T>
using isValid = void;
template<typename>
false_type checkValid(...);
template<typename T>
true_type checkValid(isValid<typename T::type>*);
struct some{
using type = int;
};
int main(){
constexpr bool result = decltype(checkValid<some>(0))::value;
}
无论我做了什么和看到了什么,我都更加好奇:
这个表达式叫什么?
template <typename>
char (&checkValid(...))[2];
&#34;变量模板&#34;? &#34;功能模板?&#34;或者&#34;一个数组,参考......&#34;? (对不起,如果我猜的很糟糕)
答案 0 :(得分:13)
它是一个功能模板,返回对char[2]
的引用。
checkValid // `checkValid` is
checkValid(...) // a function with (...) parameter list, returning
&checkValid(...) // a reference to
(&checkValid(...)) // (discard parentheses)
(&checkValid(...))[2] // an array of 2
char (&checkValid(...))[2] // characters.
template <typename> char (&checkValid(...))[2]; // And it's a template.