2013-03-22 47 views
1

我想,以防止非const对象,以我的函数参数的左值引用的结合,目前我有这样的代码:防止左值引用结合非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引用,那么它引用的对象可以被修改,但另一个进程不能访问转发过程的内存空间,因此我不会转发它。

+2

你不能使用'const'引用吗? – 2013-03-22 18:38:24

+0

我不想不。他们绑定一切AFAIK。 – user1095108 2013-03-22 18:38:40

+1

等一下,我很困惑。如果你的左值引用不能绑定到非''const'对象,那么它们绑定了什么?非常量左值引用只能绑定到非''constst'左值。 – 2013-03-22 18:39:47

回答

5

如何:

template <typename T> 
void func(const T &x) { 
    process(x); 
} 

template <typename T> 
void func(T &x) { 
    do_nothing(x); 
} 

在行动Example

+0

令人惊叹!我怎么从来没有想出这样的简单解决方案。 'const&'会绑定一切,'&'只会绑定'&'。 – user1095108 2013-03-22 19:01:22