我是新來的C++模板。我正在編寫一組可以操縱兩個不同模板類的函數。一個需要始終按值傳遞,另一個必須通過引用傳遞,因爲它代表了大量的數據。選擇c模板函數參數類型
這裏是一個簡化的例子。如果arg被標記爲ref類型,我希望函數簽名被定義爲由const ref引用它。
template<bool B, typename, typename T2>
struct if_ {};
template<typename T1, typename T2>
struct if_<true, T1, T2> {
typedef T1 type;
};
template<typename T1, typename T2>
struct if_<false, T1, T2> {
typedef T2 type;
};
struct ByvalTypeTag {};
template<typename T>
class Byval : public ByvalTypeTag
{
T somedata;
};
struct ByrefTypeTag {};
template<typename T>
class Byref : public ByrefTypeTag
{
T somedata;
};
template<typename T>
void myfunc(typename if_<std::is_base_of<ByrefTypeTag, T>::value, const T&, T>::type arg)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
Byref<int> arg;
myfunc(arg);
return 0;
}
我得到的錯誤是:
錯誤C2783: '無效MYFUNC(如果_ ::值,常量牛逼&,T> ::類型)':不能推導出模板參數的 'T'
也許這是錯誤的方式去做。如果可能的話,我試圖減少我爲相同功能編寫的相對重複模板的數量。
編譯器將無法從參數'myfunc'推斷'T',表達過於複雜(並通過模板實例落後infering類型可能需要解決停機問題,在一般情況)。 ..你必須明確地提供類型爲'myfunc < Byref>(arg)'(或者有人可以找到其他一些棘手的方法來做你想做的事情,但這是最直接的解決方案) –
2013-03-15 23:30:01