为什么这个sfinae不起作用?

时间:2018-03-23 07:11:56

标签: c++ templates sfinae typetraits compile-time-constant

for (var i = 0; i < data.result.list.length; i++) 
{
    var tr = $("<tr></tr>");                       
    tr.append("<td>" + "<a onclick=\" " + data.result.list[i].cfunction + 
"\" >" + data.result.list[i].cvalue + "</a>" + "</td>");
    tr.append("<td>" + + "</td>");
    table.append(tr);
}

输出结果为:

#include <type_traits>

using namespace std;

struct A
{
    using key_type = int;
};

template<typename T, typename = void>
struct has_key_type : false_type
{};

template<typename T>
struct has_key_type<T, decltype(typeid(typename T::key_type), void())>: true_type
{};

int main()
{
    cout << has_key_type<A>::value << endl;
    cout << has_key_type<int>::value << endl;
}

这是预期的。但是,如果我从

改变

1 0

decltype(typeid(typename T::key_type), void())

如下:

decltype(typeid(typename T::key_type), int())

输出结果为:

template<typename T>
struct has_key_type<T, decltype(typeid(typename T::key_type), int())>: true_type
{};

为什么第二个版本不起作用?

1 个答案:

答案 0 :(得分:4)

您没有给出第二个模板参数,因此它将使用默认模板参数,即void。在您的第二个版本中,decltype(typeid(typename T::key_type), int())的类型为int,因此has_key_type<A>等同于has_key_type<A, void>,肯定不会与此部分专业化相匹配。

BTW,自C ++ 17以来,您可以使用std::void_tdecltype(typeid(typename T::key_type), void())简化为std::void_t<typename T::key_type>