2015-07-05 20 views
1

我有兩個類。如何限制C++中的模板參數?

class Item { 
}; 

template <typename ItemType> 
class Result { 
}; 

我想實現一個模板,它應該接受項目和結果<項目>作爲它的模板參數(或類似int和結果< int>的)。如果參數不符合要求,則在編譯過程中應報告錯誤。

我所做的:

template <typename ItemType, typename Result> 
class Unknown { 
public: 
    Result GetItem() { 
    Result result; 
    return result; 
    } 
}; 

我的問題是,當其他類型作爲參數傳遞,沒有錯誤報告。

// OK 
Unknown<Item, Result<Item>> unknown; 
Result<Item> result = unknown.GetItem(); 

// OK 
Unknown<Item, SomeOtherResultTemplate<Item>> unknown10; 
SomeOtherResultTemplate<Item> result = unknown10.GetItem(); 

// OK 
Unknown<int, Result<int>> unknown; 

// Errors should be reported. 
Unknown<Item, int> unknown1; 
Unknown<Item, Result<int>> unknown2; 
Unknown<Item, Result<SomeOtherItem>> unknown3; 
Unknown<int, Result<double>> unknown4; 
+0

你覺得爲什麼錯誤應報告,其完全可以發送任何類型參數爲模板,如果你想限制參數,你將不得不做一些類型檢查你自己 –

回答

4

您可以更改Unknown到:

template <typename ItemType> 
class Unknown { 
public: 
    Result<ItemType> GetItem() { 
    Result<ItemType> result; 
    return result; 
    } 
}; 

,並改變它的用法:

Unknown<Item> unknown; 
Result<Item> result = unknown.GetItem(); 
+0

我喜歡這個答案,如果你有一個隱式依賴, ItemType必須等於結果中包含的類型)您應該使該依賴性明確。即確保它始終正確。最簡單的方法是使「未知」將ItemType作爲唯一的模板參數。 –