什么叫表达式'T(& some(...))[2]`其中T = char

时间:2018-06-16 14:43:39

标签: 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 

如果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;? (对不起,如果我猜的很糟糕)

1 个答案:

答案 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.