我如何以不同的方式专门化typedef及其隐式类型?

时间:2011-01-28 20:46:01

标签: c++ templates typedef specialization

我有这样的事情:

typedef int AnotherType;
template <typename T> Func( T Value );

// And I want to specialize these two cases separately:

template <> bool Func<int>( int Value ) {...}
template <> bool Func<AnotherType>( AnotherType Value ) {...}

我真的不需要专门针对int,我真正需要的是为AnotherType执行不同的函数。我无法更改AnotherType或基本函数的定义。

由于SFINAE,重载无效。

5 个答案:

答案 0 :(得分:3)

答案是否定的。键入def时,为类型创建别名,而不是实际类型。编译器会同时对待它们。这就是原因:

typedef int Foo;
typedef int Bar;

Bar bar = 1;
Foo foo = bar;

将编译。他们都是整体。

答案 1 :(得分:2)

您可以使用BOOST_STRONG_TYPEDEF

答案 2 :(得分:1)

我很确定你不能让编译器对int和AnotherType进行不同的处理。所有typedef都是别名类型 - 它实际上并不创建新类型;根据typedef结构的定义,编译器将在所有情况下处理int和AnotherType等效。

如果你需要一个只有一个被区别对待的int的类型,你应该只做一个成员struct。包含int的大多数操作将编译为与裸int相同的机器代码,但现在您的数据类型可以有自己的模板特化等。

答案 3 :(得分:1)

我无法更改AnotherType或基本功能的定义。

然后你被搞砸了。抱歉。如果您无法更改定义以使用强类型定义,那么您真正拥有的唯一选项是强类型定义。

答案 4 :(得分:0)

编译器会将两个特化都视为完全相同,因为AnotherType只是int的另一个名称。你说你不需要专门研究int,所以只需完全删除那个专门化,让它专注于任何类型的AnotherType