模板参数列表中只有typename的含义是什么?

时间:2017-04-05 11:54:49

标签: c++ c++11 templates c++14 template-meta-programming

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>的含义是什么?

1 个答案:

答案 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派生的类型。

这很简单,但我是新手,感谢您的所有评论。