【问题标题】:what's the mean of just a typename in template parameter list?模板参数列表中的类型名是什么意思?
【发布时间】:2017-08-31 00:35:33
【问题描述】:
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&lt;default_&gt;((Method*)0)) 的使用,它是如何工作的,以及它如何使第二个代码块与第一个代码块不同?像 template &lt;typename Method, typename&gt; 这样的模板参数列表中只有一个 typename 是什么意思?

【问题讨论】:

  • 你知道什么是显式和部分模板特化吗?
  • @KerrekSB:我知道partia specialization的基本含义,但是我不知道这两个代码块的区别,我需要一些帮助。
  • 未命名的类型名称类似于未命名的参数。在这里,EnablerAlwaysVoid 是个好名字。
  • @Jarod42:谢谢。这是一个很好的提示。

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


【解决方案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 派生的类型。

这很简单,但我是新手,谢谢你们所有的cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多