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>
的含义是什么?
答案 0 :(得分:1)
我终于明白了,原谅我,我是新手。
#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派生的类型。
这很简单,但我是新手,感谢您的所有评论。