2012-04-19 143 views
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和海湾合作委员会的工作,而无需使用第三方库。所以并不是所有的C++ 11功能都可以被支持。

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

+0

FWIW,为了让你的例子编译,将'A var1;'更改为'typedef A var1;' – 2012-04-19 06:42:32

+0

@Jesse问题是'var1'是一个变量,而不是一个类型。 – 2012-04-19 07:11:20

+0

好的,我添加了另一个应该在VS2010中工作的变体,尽管我无法测试它。 – juanchopanza 2012-04-19 08:19:21

回答

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; 
} 

这取决于是否能够形成一个使用你想要的类型的一些表达。

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); 
} 
+0

这似乎也给出了相同的错误。 – mmurphy 2012-04-19 06:22:25

+0

@mmurphy是啊,这太早,对不起。总废话的答案... – juanchopanza 2012-04-19 06:24:17

+0

@mmurphy好的,固定为C++ 11。我会看看我是否能够拿出相应的C++ 03模板魔术。 – juanchopanza 2012-04-19 06:31:05

相关问题