2016-11-04 72 views
0

我對C++模板元編程相當陌生,並試圖完成以下工作。讓我們說我有一個自定義的模板類這樣如何從其他類型獲取類型(C++模板元編程)

template<typename Parameter> 
class MYCLASS { 
public: 
    Parameter parameter; 
    //Do something with it 
}; 

現在,爲了讓用戶實例化類,他/她需要做

#include "other.h" //A header from other libraries 
MYCLASS<other::someclass> myclass; //Suppose there is a class called other::someclass in the "other.h" 

我想做足了用戶的問題尋找標題,我想嘗試使用元編程,像這樣的東西

template<typename Type> 
struct get_right_type_impl{ 
    //Do something here 
}; 

template<typename Type> 
using get_right_type_ = get_right_type_impl<Type>::type; 

其中get_right_type_應返回另一種類型。例如,它應該採取雙重參數和返回等:: SomeClass的,因此類的定義應該看起來像

template<typename Type> 
class MYCLASS { 
public: 
    get_right_type_<Type> parameter; 
    //when Type==double, get_right_type_<Type> should be equivalent to other::someclass 
}; 

//Now one can use instantiation like this 
MYCLASS<double> class; 

我已經試過的東西,大部分是跟隨this。雖然我認爲我得到了一些文章,但我沒有編寫出通常使用typename時出現編譯問題的示例。在閱讀本論壇的一些答案之後,我感到更加困惑,並且我們不確定這是否甚至可能出現在我們的案例中,因爲我還沒有從Google搜索中找到確切的解決方案。

歡迎任何建議。

+1

您的問題只是'typename'編譯器錯誤? '使用get_right_type = get _... :: type;'應該'使用get_right_type = typename get _... :: type;'。 – TartanLlama

+0

還有其他編譯錯誤。我會稍微編輯一下。謝謝你的幫助〜 –

+0

是的。這是非常愚蠢的問題。這是typename問題.......感謝您的幫助 –

回答

1
template<typename Type> 
using get_right_type_ = get_right_type_impl<Type>::type; 

考慮編譯器在看到這些時認爲的內容。它不知道::type是否是一些變量或某種類型的別名!您需要向編譯器指定「嗨,我說'type'是一個類型名稱,所以請使用它」。因此,使用關鍵字typename明確地說,接下來是一種類型。

繼續前進,get_right_type基本上需要是一個type to type map。這很容易做到。

template <typename T> struct get_right_type; 
template <> struct get_right_type<double> { using type = class_for_double; } 
template <> struct get_right_type<int> { using type = class_for_int; } 

考慮上面的類型映射是在一些頭文件中說'common_mapping.h'。 您可以執行以下操作:

#include "common_mapping.h" 
get_right_type<int>::type a; 
+0

AHHHHH,它的工作,我理解。對不起,這真是一個愚蠢的問題......... –