如果我有一个类型为模板类的变量,并且我想构建另一个模板化类的另一个变量,但是使用相同的模板参数,我该怎么办?
虽然下面的示例不起作用,但它希望能够提供我想要实现的目标。如果没有非常具体的方法来执行此操作,是否有办法使用某种查找表设计模式来执行此操作?我可能最终会使用六种不同的模板类型。
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>
,因为此代码只是一个测试用例场景,以显示我想要的基本功能。我想要一种从类型为模板的变量中获取模板类型的方法。
答案 0 :(得分:2)
在C ++ 11中,您可以使用decltype
:
B<decltype(var1)::Type> var2;
如果你想在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;
}
这取决于能否形成一些使用所需类型的表达式。