c++ - 为包含 typedef 的类型专门化模板

标签 c++ sfinae type-traits

我有一个模板类,需要专门用于包含特定 typedef 的模板参数。所以我需要两个定义,一个用于它具有 typedef 的情况,另一个用于它不具有 typedef 的情况。

我的问题是我不知道如何否定 SFINAE。我显然可以消除非特殊参数的特殊情况,但我不知道如何消除特殊参数的默认情况。

所以我尝试了这样的部分特化:

struct NormalType { };

struct SpecialType { typedef int special; };

template <typename T, typename IsSpecial = void>
struct DetectSpecial {
    void detected() { std::cout << "Not special...\n"; }
};

template <typename T>
struct DetectSpecial<T, typename T::special> {
    void detected() { std::cout << "Special!\n"; }
};

但是特化没有被使用( as SSCCE on ideone )。

我也考虑过使用enable_if ,但我不知道如何将它用于格式良好与格式不正确的表达式,而不是 true/false。

对于包含特定 typedef 的类型以不同方式定义 DetectSpecial 的最简单方法是什么(typedef 的值可以是任何值;它的存在很重要)?

哦,我仍然坚持使用一些 C++03 编译器。无论如何,我认为 SFINAE 没有任何变化。

最佳答案

所需的最小更改是在专门化中插入一些依赖于 T::special 并产生 void 的表达式(以匹配默认参数)。例如:

template<class T>
struct void_alias
{
    typedef void type;
};

template <typename T>
struct DetectSpecial<T, typename void_alias<typename T::special>::type> {
    void detected() { std::cout << "Special!\n"; }
};

关于c++ - 为包含 typedef 的类型专门化模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21992267/

相关文章:

c++ - 可选未初始化的类: std::is_trivially_constructible 对于非默认构造函数似乎不正确?

c++ - 关于 C++ 中 std::promise 的错误

c++ - 使用非类型模板参数转发声明函数模板

c++ - SDL2_Image 所需的 png/jpeg dll

c++ - decltype(..., void()) 和 void_t 的区别

c++ - 添加基于模板参数的拷贝构造函数

c++ - 记录我的 C++ 类型是可 memcopyable 且 noop 可破坏的

类方法 : partial specialization if parameter is enum 上的 C++ 类型特征

c++ - 从整数中减去指针

C++错误: no match for 'operator<<' (operand types are