2017-10-10 3 views
0

私はこのようになりますクラスを持っていますこの種のことを処理するストア任意の値とクラスの特定の範囲の値が

Physical_componentがことができるようになります。店の種類の設定量、および完全にタイプを保持(私はにキャストすることができます何かが十分です)

  • が可能な方法でオブジェクトを格納すべき

    1. それらは個別のものから渡されたものです(したがって、orignialクラスへの変更から保護されています)

    私はenumと並んでcでexcistingのようなものを覚えていますが、私はその名前を知らない。また、C++にはおそらくもっと良い方法があります。

    Storage_componentをすることになっている:

    1. ストア任意のタイプ
    2. (オプション)私はこれを適切に達成するためにどのようには考えている元の型

    を覚えています。私はstd :: anyを見ましたが、それはむしろ新しいので、私は知っていないようです。また、ベクトルに格納することができないので、storage_componentをテンプレートにすることはできません。

    これらのクラスを実装するにはどのような方法がありますか?

  • +1

    あなたのコンパイラとライブラリがC++ 17(['std :: any'](http://en.cppreference.com/w/cpp/utility/any)を導入した最新版でない場合)おそらく[Boost any](http://www.boost.org/doc/libs/1_65_1/doc/html/any.html)?あるいは、おそらく['std :: variant'](http://en.cppreference.com/w/cpp/utility/variant)(またはその[Boost equivalent](http://www.boost.org/doc/libs) /1_65_1/doc/html/variant.html))。あるいは、要件分析をチェックし、そのようなタイプ消去がデザインに必要でないことを確認してください。おそらくそれは他の方法で解決できるでしょうか? –

    +0

    @Someprogrammerdudeなぜ人々はboost :: btwを使用しますか?私はどこにでも見ていますか?すべてのstd :: functionsが含まれているか、実際にはより速く/より速いからですか?ここで何が起こっているのですか? ありがとうございます。私はstdの外部リソース::すべての実装が正常に動作するように見えた。私はあまり気にしないと思います。 – MoustacheSpy

    +1

    標準ライブラリの機能の一部、または標準ライブラリの将来のバージョンで提供される機能のいくつかは、Boostライブラリで開始されました。例えばBoost any。 'std :: any'のために十分新しいコンパイラを持っていなければ、Boost anyが適切な置換えです。 [Boost](http://www.boost.org/)は単一のライブラリではなく、多くのライブラリのコレクション*です。いくつかは、標準ライブラリの動作を複製しますが、多くの場合* * *以上のものもあります。 –

    答えて

    0

    ストアの種類の設定量、および完全にあなたがおそらくstd::variant<Ts...>(またはboost::variant<Ts...>をしたいタイプ

    を保持。特定の時点でTs...のいずれかを格納するを格納します。


    ストア任意のタイプ

    すべてのタイプが同じインターフェイスを共有している場合、伝統的なvirtual + std::unique_ptr多型のアプローチを使用します。それ以外の場合はstd::anyが適切です。

    +0

    偉大な答えをありがとう!任意のタイプ(int、charなどを含む)を使用するようなストレージIDについては、同じインターフェースを使用しないと思います。 std :: anyは渡されたクラスのコピーを自動的に作成しますか?これは手動で行う必要がありますか?私はstd :: variantについて同じ質問をしています – MoustacheSpy

    +0

    'std :: variant'と' std :: any'は両方とも値の意味型です - あなたの現在アクティブな型をコピーします。 –

    +0

    @MoustacheSpy:答えへのリンクをいくつか追加しました。詳細については、それらをチェックしてください。 –

    関連する問題