我想阻止将对非const对象的左值引用绑定到我的函数参数,目前我有这个代码:
template <typename T>
using remove_cr = std::remove_const<typename std::remove_reference<T>::type>;
template <typename T>
using is_nc_lvalue_reference
= std::integral_constant<bool,
std::is_lvalue_reference<T>::value
&& !std::is_const<typename std::remove_reference<T>::type>::value
>;
template <typename T>
void func(T && v, typename std::enable_if<
std::is_same<THE_TYPE_I_WANT, typename remove_cr<T>::type>::value
&& !is_nc_lvalue_reference<T>::value>::type* = 0)
{
}
这对我来说似乎有很多代码,是否存在更优雅的SFINAE或非SFINAE方法?我不需要完美的转发,但如果我不使用它,我会失去T
。
这个想法是,const
对象不应该被修改,因此我可以将它们转换为其他表示并将它们提供给它们,比如说不同的进程。如果给出了非const引用,则可以修改它引用的对象,但是其他进程无法访问转发进程的内存空间,因此我不转发它。
答案 0 :(得分:5)
这个怎么样:
template <typename T>
void func(const T &x) {
process(x);
}
template <typename T>
void func(T &x) {
do_nothing(x);
}
Example正在行动中。