2012-04-19 139 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

相關問題