从不同的变量模板类型构建变量的模板类型

时间:2012-04-19 06:17:35

标签: c++ templates design-patterns

如果我有一个类型为模板类的变量,并且我想构建另一个模板化类的另一个变量,但是使用相同的模板参数,我该怎么办?

虽然下面的示例不起作用,但它希望能够提供我想要实现的目标。如果没有非常具体的方法来执行此操作,是否有办法使用某种查找表设计模式来执行此操作?我可能最终会使用六种不同的模板类型。

template<typename T>
class A{
public:
    typedef T Type;
};

template<typename T>
class B{};

int main(void){
    A<int> var1;

    B<var1::Type> var2;
}

如果这是一个重复的问题我很抱歉,但我之前没有看到过这样的问题。

修改

我希望有一种方法可以使用Visual Studio 2010和gcc,而无需使用第三方库。因此,并非所有C ++ 11功能都受支持。

此外,不使用typedef A<int>或了解A<int>,因为此代码只是一个测试用例场景,以显示我想要的基本功能。我想要一种从类型为模板的变量中获取模板类型的方法。

2 个答案:

答案 0 :(得分:2)

在C ++ 11中,您可以使用decltype

B<decltype(var1)::Type> var2;

它应该有效。请参见decltype herehere

如果你想在C ++ 03中做类似的事情,你可以尝试在模板化函数中应用你的功能:

template <typename T>
void doSomething(const T& var1) {

  B<typename T::Type> var2;
  // do whatever you wanted to do with var2 here.
  // problem is, you cannot return it.
  std::cout << "Doing something!\n";

}

int main(void){
    A<int> var1;
    doSomething(var1);
}

修改:感谢@MSalters指出您在VS2010中拥有auto关键字,因此可以定义此功能:

template <typename T>
B<typename T::Type> makeB(const T&) {
  return B<typename T::Type>();
}

然后像这样使用它:

int main(void){
    A<int> var1;
    auto var2 = makeB(var1);
}

答案 1 :(得分:2)

即使使用VC ++ 2010的预标准化decltype,我认为您可能会做到这样的事情:

template<typename T>
struct A {
    typedef T Type;
    Type foo();
};

template<typename T>
struct B {};

int main() {
    A<int> var1;
    B<decltype(var1.foo())> var2;
}

这取决于能否形成一些使用所需类型的表达式。