RaG*_*__M 8 c++ templates template-meta-programming
我已经在库实现中看到了这个表达式,我基本上理解它已被用于培养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
Run Code Online (Sandbox Code Playgroud)
如果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;
}
Run Code Online (Sandbox Code Playgroud)
无论我做了什么和看到了什么,我都更加好奇知道:
这个表达式叫做什么?
template <typename>
char (&checkValid(...))[2];
Run Code Online (Sandbox Code Playgroud)
"变量模板"?"功能模板?" 或者"参考......的阵列"?(对不起,如果我猜的很糟糕)
Hol*_*Cat 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.
Run Code Online (Sandbox Code Playgroud)