template <typename Method, typename>
struct is_default : std::false_type { };
上面的代码和这段代码有什么区别:
struct default_ { };
template <typename Method>
struct is_default<Method, decltype((void)
static_cast<default_>(*(Method*)0)
)>
: std::true_type
{ };
我可以弄清楚最后一个是用来识别是否Method
是默认的。但我无法理解 decltype((void)static_cast<default_>((Method*)0))
的用法,它是如何工作的,以及它如何使第二个代码块与第一个代码块不同? typename
的意思是什么?在这样的模板参数列表中 template <typename Method, typename>
?
最佳答案
终于明白了,见谅,我是新手
#include <type_traits>
#include <iostream>
#include <typeinfo>
struct default_ { };
template <typename T, typename = void>
struct is_default;
template <typename T>
struct i_am_default : default_ { };
template <>
struct i_am_default<float> { };
template <typename Method, typename>
struct is_default : std::false_type { };
template <typename Method>
struct is_default<Method, decltype((void)
static_cast<default_>(*(Method*)0)
)>
: std::true_type
{ };
int main()
{
std::cout << is_default<i_am_default<int>>{} << '\n';
std::cout << is_default<i_am_default<float>>{} << '\n';
using type = i_am_default<int>;
std::cout << typeid(decltype((void)static_cast<default_>(*(type*)0))).name() << '\n';
}
上面的代码是c++ sfinae
。
不是从 default_ 派生的类型将是一个编译时错误,然后将选择从 std::false_type 派生的类型。
这很简单,但我是新手,感谢您的所有评论。
关于c++ - 模板参数列表中的类型名称是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43230456/