2017-04-02 190 views
0

我有一個模板類型:如何檢查類型是一個給定的模板類型

template<class T> 
struct Shadow { 
    T field[100]; 
}; 

我想創建一個tuple,它的類型是Shadow實例,但不應該允許任何其他類型。例如,

tuple< Shadow<int>, Shadow<double> > x; // correct instantiation. 
tuple< Shadow<int>, double > x; // incorrect instantiation. 

我該如何做到這一點(並且在不正確的實例化的情況下編譯器標記錯誤)?

+0

是'tuple'了'性病:: tuple'或你定義的類? – kennytm

+0

它不需要是std :: tuple,我可以包裝。 – user1205476

回答

2

,我可以想像的包裹元組的可變參數模板結構(或類)中的溶液

#include <tuple> 

template <typename T> 
struct Shadow 
{ T field[100]; }; 

template <typename ... Ts> 
struct wrapTShadow 
{ std::tuple<Shadow<Ts>...> val; }; 

int main() 
{ 
    // contain a std::tuple<Shadow<int>, Shadow<double>> 
    wrapTShadow<int, double> wts; 
} 
+0

感謝您的建議。你能告訴我std :: tuple ...>是嗎?我很困惑,你可以調用Shadow ,雖然「結構陰影」不接受可變模板! – user1205476

+1

@ user1205476 - 你必須區分'std :: tuple >'和'std :: tuple ...>';假設'... Ts'是'T1,T2,T3'; 'std :: tuple >'被解壓縮爲'std :: tuple >'(這對你來說是錯誤的); 'std :: tuple ...''被解壓爲'std :: tuple ,影子,影子>'(這就是你需要的,在這種情況下,我想) – max66

+0

@ user1205476 - ps:在alangab的解決方案中:它基於相同的想法,但是避免了包裝結構的需要。更簡單,更優雅,(我懷疑)更高效 – max66

2

你可以使用類型別名:

template<class ...Args> 
using shadow_tuple = std::tuple<Shadow<Args>...>; 

int main() 
{ 
    shadow_tuple<int, double> xx; 
    return 0; 
} 
相關問題