问题:
我正在使用C++11开发程序。 我想编写一个同时接受rvalue引用和lvalue引用的函数(即通用引用)的函数。
以下函数接受通用引用参数:
以下函数接受通用引用参数:
template<class T> void function(T&& t){/*SNIP*/}
然而,该函数接受所有类型的参数。这破坏了函数的类型安全性。如果我想让它接受特定类型的参数怎么办?
以下是我能想到的解决方案:
void function(Class& t){/*SNIP*/}
void function(Class&& t){ function(t); }
然而,这很丑陋。如果我想改变要接受的参数或更改函数名称,我必须更新函数的两个版本。有没有更好的等效方法?
编辑:问题已解决。你们两个都回答得很好。我投了+1票给两个答案以表达我的感激之情。我会把这个问题留下几天。获得最多赞同票的答案将被接受。
编辑2:最终我采用了以下代码:
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&&){}
编辑3:为此目的,我编写了一个宏定义:
#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&&){}
void function(Class&& t){/*COPY OF SNIP*/}
? - mucaho