gpt4 book ai didi

c++ - 为什么这个 sfinae 不起作用?

转载 作者:太空狗 更新时间:2023-10-29 20:51:34 26 4
gpt4 key购买 nike

#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
0

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

最佳答案

您没有提供第二个模板参数,因此它将使用默认模板参数,即 void .在您的第二个版本中,类型为 decltype(typeid(typename T::key_type), int())int , 所以 has_key_type<A> ,相当于 has_key_type<A, void> , 肯定不会匹配这个偏特化。

顺便说一句,自 C++17 起,您可以使用 std::void_t简化decltype(typeid(typename T::key_type), void())std::void_t<typename T::key_type> .

关于c++ - 为什么这个 sfinae 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49444243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com