【发布时间】:2010-06-09 18:09:29
【问题描述】:
我正在尝试编写使用模板参数的成员 typedef 的代码,但如果模板参数没有该 typedef,我想提供默认类型。我尝试过的一个简化示例是这样的:
struct DefaultType { DefaultType() { printf("Default "); } };
struct NonDefaultType { NonDefaultType() { printf("NonDefault "); } };
struct A {};
struct B { typedef NonDefaultType Type; };
template<typename T, typename Enable = void> struct Get_Type {
typedef DefaultType Type;
};
template<typename T> struct Get_Type< T, typename T::Type > {
typedef typename T::Type Type;
};
int main()
{
Get_Type<A>::Type test1;
Get_Type<B>::Type test2;
}
我希望这会打印“Default NonDefault”,但它会打印“Default Default”。我的期望是 main() 中的第二行应该匹配 Get_Type 的专用版本,因为 B::Type 存在。但是,这不会发生。
谁能解释这里发生了什么以及如何解决它,或者以其他方式实现相同目标?
谢谢。
编辑:
Georg 提供了另一种方法,但我仍然很好奇为什么这不起作用。根据 boost enable_if 文档,一种针对不同类型专门化模板的方法如下:
template <class T, class Enable = void>
class A { ... };
template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };
template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };
这是因为 enable_if 有 type 作为 typedef,但 enable_if 没有。
我不明白这与我的版本有何不同,我只是直接使用 T::Type 而不是使用 enable_if。如果存在 T::Type 是否与上面示例中的 enable_if::type 相同并导致选择专业化?而如果 T::Type 不存在,那岂不是和 enable_if::type not existing 一样,导致上面例子中选择了默认版本?
【问题讨论】:
-
目标是 Get_Type
::Type 如果存在则为 T::Type,如果不存在则为 DefaultType。