c++ - 模板参数列表中的类型名称是什么意思?

标签 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>

最佳答案

终于明白了,见谅,我是新手

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

相关文章:

c++ - Base 和所有 Derived 的专门类(class)

c++ - 使用 openssl 构建静态二进制文件的正确方法是什么?

c++ - atomic<int>::fetch_add 的成本与 __sync_fetch_and_add

c++ std::ofstream 刷新()但不关闭()

c++ - 将一个对象的函数传递给另一个类的另一个 std::function

C++11: "= {}"的类内初始化不适用于显式构造函数

python - 使用自定义占位符、对象的点访问和容错来格式化字符串

c++ - 如何使用 pack 作为模板参数实例化专门的模板类?

c++ - “boost/iostreams/device/file_descriptor.hpp”文件未找到错误

c++ - 使用CMake获取包含库的包含路径列表