我是 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:“void myfunc(if_::value,const T&,T>::type)”:无法推断“T”的模板参数
也许这是错误的处理方式。如果可能的话,我会尝试减少为相同功能编写的相对重复模板的数量。