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
{};
为什么第二个版本不起作用?
答案 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_t
将decltype(typeid(typename T::key_type), void())
简化为std::void_t<typename T::key_type>
。