3

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

虽然下面的例子不起作用,但它希望能给出我想要完成的想法。如果没有非常具体的方法来做到这一点,有没有办法有某种查找表设计模式来做到这一点?我最终可能会使用大约六种不同的模板类型。

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>此代码只是一个测试用例场景,用于显示我想要的基本功能。我想要一种从类型为模板的变量中获取模板类型的方法。

4

2 回答 2

2

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

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

它应该可以工作。请参阅此处此处的decltype 。

如果你想在 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 指出您auto在 VS2010 中有关键字,因此可以定义此函数:

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);
}
于 2012-04-19T06:18:51.813 回答
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;
}

这取决于能够形成一些使用您想要的类型的表达式。

于 2012-04-19T07:25:35.527 回答