我有一个模板类需要专门用于包含特定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
,但我没有看到如何将它用于格式良好的格式与非格式良好的表达式而不是真/假。
对于包含特定typedef的类型,定义DetectSpecial
的最简单方法是什么?(typedef的值可能是任何东西;它的存在很重要)?
哦,我仍然坚持使用一些C++ 03编译器。无论如何,我认为SFINAE没有任何变化。
这不会起作用,因为'T :: special'不是'void'。当你实例化'DetectSpecial'时,你正在实例化'DetectSpecial ',它与'DetectSpecial '(部分特化)不匹配。 –
dyp