我有一个模板类,需要专门用于包含特定 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/