【问题标题】:Reverse Template Alias反转模板别名
【发布时间】:2011-11-04 07:34:33
【问题描述】:

我需要一些方法来实现“反向模板别名”。因此,我会使用模板 typedef 来选择要在编译时使用的正确类。我想做以下事情:

typedef ClassA Temp<int>;
typedef ClassB Temp<char>;

ClassA 和 ClassB 不是模板类,但我想通过使用模板来选择正确的类。因此,如果需要 Temp,它实际上会使用 ClassA。在 C++ 中这样的事情甚至可能吗?我尝试了以下方法,但没有成功。

template<>
typedef ClassA Temp<int>;

template<>
typedef ClassB Temp<char>;

我在 GCC 中遇到以下错误

error: template declaration of ‘typedef’

【问题讨论】:

  • 你能给出一个你想要实现的代码示例吗?在您的示例中 ClassA 和 ClassB 是具体类型,而不是模板。
  • 你不能模板化类型定义。但是有一些方法可以解决这个问题,这取决于你想做什么。

标签: c++ templates


【解决方案1】:

不,typedef 不能定义类型模板,只能定义类型。您可以做的最接近的两件事是:

template <typename T>
struct Temp;

template <>
struct Temp<int> : ClassA {}

template <>
struct Temp<char> : ClassB {}

所以你只写Temp&lt;int&gt;,但它是派生类,而不是类本身,或者

template <typename T>
struct Temp;

template <>
struct Temp<int> { typedef ClassA Type; }

template <>
struct Temp<char> { typedef ClassB Type; }

所以你可以自己得到ClassAClassB,但你必须写Temp&lt;int&gt;::Type

【讨论】:

  • 谢谢!第二个例子正是我想要的。我早该想到的。在派生类的例子中,如果我不给模板类添加任何东西,会不会和使用实际的类一样?
  • @Justin:不,它不会,因为它仍然是一种形式上不同的类型。您可以将 Temp&lt;int&gt; 实例传递给 ClassA 参数,但不能反过来。
  • 我怎么称呼新的? ptr = new Temp::Type() 不起作用。
  • @Justin:使用混凝土 T 应该可以工作。但是在模板内部,您必须使用typenamenew typename Temp&lt;T&gt;::Type () 显式标记您希望成为类型名的依赖名称。这是因为 C++ 语法(继承自 C)在不知道标识符是否为类型的情况下是模棱两可的,并且编译器还不知道要为哪个 T 评估模板,因此它无法自行判断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多