2

非 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 以外の参照が指定された場合、それが参照するオブジェクトは変更できますが、他のプロセスは転送プロセスのメモリ空間にアクセスできないため、転送しません。

4

1 に答える 1

6

これはどう:

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

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

実際の例

于 2013-03-22T18:56:59.453 に答える