2

さまざまな状況で、多くの関数で処理する必要があるオブジェクトのコレクション (ベクトルなど) があります。オブジェクトを変更する必要がある関数もあれば、そうでない関数もあります。オブジェクトのクラスは、抽象基本クラスから継承できます。したがって、私は次のようなものを持っています:

class A
{
public:
    virtual void foo() const = 0;
    virtual void bar() = 0;

    /* ... */
};

void process_1(std::vector<std::reference_wrapper<A>> const &vec);
void process_2(std::vector<std::reference_wrapper<A const>> const &vec);

明らかに (?) とstd::reference_wrapper<A>の両方に s のprocess_1同じベクトルを渡すことはできませんprocess_2。これまでに検討したソリューションには次のものがあります。

  • C スタイルのキャストまたはreinterpret_castへの参照を使用するvec
  • T& get()andT const & get() constの代わりに独自の参照ラッパーを作成するT& get() const
  • ベクトルの代わりにラッパーを取るメソッドなどによるリファクタリング
  • ベクトルのコピーを含む、または含まないconst
  • constinreference_wrapperの引数を使用しない

これらはどれも非常にエレガントに見えません。他にできることはありますか?

4

2 に答える 2

1

エレガンスに欠けていても、参照ラッパーを作成します。

#include <functional>

template <typename T>
class ReferenceWrapper
{
    public:
    ReferenceWrapper(T& ref)
    :   m_ref(ref)
    {}

    ReferenceWrapper(const std::reference_wrapper<T>& ref)
    :   m_ref(ref)
    {}

    const T& get() const noexcept { return m_ref.get(); }
    T& get()  noexcept { return m_ref.get(); }

    operator const T& () const  noexcept { return m_ref.get(); }
    operator T& ()  noexcept { return m_ref.get(); }

    private:
    std::reference_wrapper<T> m_ref;
};

これは、元の要件をモデル化した小さなクラスです。

于 2014-06-22T18:39:38.390 に答える