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

Building a variable's template type from a different variables template type

本文关键字:类型 变量 构建      更新时间:2023-10-16

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

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

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一起使用,而无需使用第三方库。因此,并非所有 11 C++功能都受支持。

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

即使使用 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;
}

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

在 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指出您在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);
}