问题:我正在用 C++11 开发一个程序。我想编写一个同时接受右值引用和左值引用的函数。(即通用参考)。
以下函数接受通用引用参数:
template<class T> void function(T&& t){/*SNIP*/}
但是,它接受所有类型的参数。它破坏了函数的类型安全。如果我希望它接受特定类型的参数,我该怎么办?
这是我能想到的解决方案:
void function(Class& t){/*SNIP*/}
void function(Class&& t){ function(t); }
然而,它很丑。如果我想更改要接受的参数或更改函数名称,我必须更新函数的两个版本。有比这更好的等价物吗?
编辑:问题解决了。你们俩都回答得很好。我对这两个答案都投了 +1 以表示感谢。我打算把这个问题留几天。得票最多的答案将被接受。
EDIT2:我最终得到以下代码:
template < class T,
class=typename std::enable_if<std::is_same<Class, typename std::decay<T>::type>::value>::type //Dummy template parameter
>
void function(T&&){}
EDIT3:我为此目的编写了一个宏定义:
#define uRefType(T, typeLimit) class T, class=typename std::enable_if<std::is_same<typename std::decay<T>::type, typeLimit>::value>::type
使用示例:
template< uRefType(T, Class) > void function(T&&){}