C++11での転送方法を理解しています。
template <class T> void foo(T &&)
foo は、左辺値と右辺値の両方を受け入れるようになりました。
私の問題は、さらに foo をオーバーロードするときです。次の簡単なコードを検討してください。
template <class T> class A {};
template <class T> void foo(T &&obj) {}
template <class T> void foo(A<T> &&obj) {}
int main() {
int i;
A<int> a;
foo(i); // calls foo(T &&) as I want
foo(a); // calls foo(T &&), but I want it to call foo(A<T> &&)
return 0;
}
(左辺値) オブジェクトで呼び出すと、 ではなく が呼び出さfooれます。の定義では、 std とカスタム トレイトでisかどうかを区別することができましたが、からメソッドを呼び出す必要があり、 asではなく として宣言されているため、非常に厄介なコードが生成されます。宣言を並べ替えたり、左辺値のオーバーロードを追加したりしても、問題は解決しません。A < int > &foo(T &&)foo(A < T > &&)foo(T &&obj)objA<T>AobjobjTA < T >
私が自分自身を理解したことを願っています。問題を特定するために、簡略化されたコードを提供しました。カスタムOptional < T >クラス ( に類似) を実装していますが、別の、、またはオブジェクトからオブジェクトboost::optionalを作成 (および割り当て) できるようにする必要があるため、コンストラクターでこの問題が発生しています。(ここで、 は作成するオプション オブジェクトが保持する型であり、は別の型であり、 に変換可能です)。Optional < T >Optional < T >Optional < U >TUTUT
お時間をいただきありがとうございます。