2013-03-22 45 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