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)
obj
A<T>
A
obj
obj
T
A < T >
私が自分自身を理解したことを願っています。問題を特定するために、簡略化されたコードを提供しました。カスタムOptional < T >
クラス ( に類似) を実装していますが、別の、、またはオブジェクトからオブジェクトboost::optional
を作成 (および割り当て) できるようにする必要があるため、コンストラクターでこの問題が発生しています。(ここで、 は作成するオプション オブジェクトが保持する型であり、は別の型であり、 に変換可能です)。Optional < T >
Optional < T >
Optional < U >
T
U
T
U
T
お時間をいただきありがとうございます。