boost::variant<T, E>
から派生した型があります。私は次のことをして、私はコピーコンストラクタを使用することはできません、私は理由を把握することができない、いくつかSFINAE
が失敗するようです。 boost::variant<T, E>
構造が継承されたコンストラクタでT
をExpectedResult<T, E>
として飲み込んでいるように見えます。 私はそれを簡単に解決できるように修正できますか?boost.variant派生型:コピーコンストラクタを使用できません
2
A
答えて
4
ブーストバリアントには、完全な転送コンストラクタがあります。
あなたのクラスにインポートしています。
self
がちょうどboost::variant
であるかどうかをチェックすることにより、self&
の消費を防ぎます。あなたはそれをExpectedResult&
に渡しています。
これは混乱します。
template <class T, class E>
struct ExpectedResult : boost::variant<T, E> {
using boost::variant<T, E>::variant;
ExpectedResult()=default;
ExpectedResult(ExpectedResult const&)=default;
ExpectedResult(ExpectedResult &&)=default;
ExpectedResult(ExpectedResult & o):
ExpectedResult(const_cast<ExpectedResult const&>(o))
{}
ExpectedResult(ExpectedResult &&)=default;
ExpectedResult(ExpectedResult const&& o):
ExpectedResult(o) // calls const& ctor
{}
ExpectedResult& operator=(ExpectedResult const&)=default;
ExpectedResult& operator=(ExpectedResult &&)=default;
ExpectedResult& operator=(ExpectedResult &) {
return *this=const_cast<ExpectedResult const&>(o);
}
ExpectedResult& operator=(ExpectedResult const&& o){
return *this = o; // const& assign
}
};
上記の既定の手作業で作成された特別なメンバー関数が役立つと思われます。
さらに、volatile
を追加して別の束で爆発させる必要があります。
私は自分自身の完璧な転送コンストラクタと親コンストラクタを使うことに注意しています。私は現在、継承されたコンストラクタを使用することについて非常に心配しています。なぜなら、私はまだ完全に理解していません。
もう1つのアプローチは、継承を回避し、代わりにバリアントに進むことです。
template <class T, class E>
struct ExpectedResult : boost::variant<T, E> {
using base=boost::variant<T, E>;
ExpectedResult()=default;
ExpectedResult(ExpectedResult const&)=default;
ExpectedResult(ExpectedResult &&)=default;
ExpectedResult(ExpectedResult &&)=default;
ExpectedResult& operator=(ExpectedResult const&)=default;
ExpectedResult& operator=(ExpectedResult &&)=default;
template<class T0, class...Ts,
class=std::enable_if_t<
std::is_constructible<base, T0, Ts...>::value
&& (
(sizeof...(ts)!=0)
|| !std::is_same<std::decay_t<T0>, ExpectedResult>::value
)
>
>
ExpectedResult(T0&&t0, Ts&&...ts):
base(std::forward<T0>(t0), std::forward<Ts>(ts)...)
{}
};
完全に不完全な状態では完全に転送されますが、ほとんどの場合は十分に近い状態です。
initializer_list<T>, Ts&&...
コンストラクタは完璧な転送をより完全に行うことができるため、ExpectedResult<std::vector<int>, bool> er{ {1,2,3,4} }
が動作します。
関連する問題
- 1. Kotlin:派生型を返すことができません
- 2. 派生クラスのメンバ変数に派生型を使用
- 3. C++でunique_ptrを持つ派生型を返すことができません
- 4. 派生型でプロパティセットメソッドが見つかりません
- 5. EditorForは派生型では機能しません
- 6. 基本クラスオブジェクトを派生型オブジェクト、Entity Frameworkコードファーストにキャストできません
- 7. 派生クラスのIEnumerableベースクラスでLINQメソッドを使用できません
- 8. は密封型 'ResourceDictionary'から派生することはできません。Xamarin.forms
- 9. 派生型名
- 10. 型パラメータ名:型はjava型から派生しません。 - Xamarin android
- 11. 派生型のキー...しかしそれはありません
- 12. MPI派生データ型
- 13. は、暗黙のうちにそのベースジェネリック型に派生型を変換できません -
- 14. Fortranで派生型ポインタと多相ターゲットを使用する
- 15. WebViewFragment派生クラスをFragmentTransactionに追加できません
- 16. 無効な割り当てサイズ(派生クラスのコピーコンストラクタで)
- 17. 型引数は型引数では使用できません
- 18. 非ジェネリック型 'DelegateCommand'は型引数で使用できません
- 19. 継承 - 派生クラスの基本クラスデータメンバにアクセスできません
- 20. KeyValueConfigurationCollectionから派生クラスにキャストできません
- 21. GADTを使用して型クラス制約を自動的に派生させる
- 22. 型同義語の型インスタンスは使用できません
- 23. 派生クラスでコピーコンストラクタを宣言するには、ベースでデフォルトのコンストラクタを使用しないでください。
- 24. 派生単位付きMeasurementFormatterの使用
- 25. 派生型のフィールドを使用したフィルタ
- 26. MPIの派生データ型を使用する
- 27. 派生型でクラスの静的メンバーを使用していますか?
- 28. 保存派生クラス型
- 29. Json.netデシリアライズJOBJECT派生型に
- 30. 空派生クラスVs型プロパティ
ガード動作をバグと見なすべきでしょうか?私は必要なすべての複製を過度に見つけます。多分私はバグを提出するべきです。 –
@GermánDiagoタイプはおそらく継承されるようには設計されていません。しかし、is_sameをis_base_ofに変更して、あなたのケースでうまく動作させる可能性があります。それが他の問題を引き起こすかどうかはわかりません... – Yakk