3

次の要件を持つデータコンテナがあります。

  • 高速にする:したがって、通常の継承ではなくテンプレート
  • さまざまな実装を使用する
  • より多くのメソッドでこれらの実装を拡張できる
  • データはテンプレート引数を介して指定され、データコンテナアイテムへのポインタを保存できる必要があります

私が思いついた解決策は次のとおりです。

    template<typename T, template<typename> class container_t>
class data_c
{
public:
    typedef data_c<T, container_t> value_type;
    typedef typename container_t<value_type>::ref container_ref;

    container_ref link;
    T c;
};

template<typename T>
class storage_container_impl
{
public:
    typedef T value_type;
    typedef storage_container_impl<T>* ref;
    T data;
};

template<typename _impl>
class storage_container : public _impl
{
public:
    typedef typename _impl::value_type value_type;
    typedef typename _impl::ref ref;
};

template<typename T>
using impl_storage_container = storage_container<storage_container_impl<T> >;

typedef impl_storage_container<data_c<int, impl_storage_container> > c_storage_container;

int main()
{
    c_storage_container tmp;
    tmp.data.c=5;
    tmp.data.link=&tmp;
    return tmp.data.c;
}

次のエラーが発生します(gcc 4.7):

test1.cpp:6:48: error: no type named 'ref' in 'impl_storage_container<data_c<int, impl_storage_container> > {aka class storage_container<storage_container_impl<data_c<int, impl_storage_container> > >}'

T *dataの代わりに使用する場合T data(ただし、その間接参照は必要ありません)、またはを使用せずに直接storage_container_impl持っている場合に機能します。ミックスインスタイルを使用しても問題は解決しません。ポインタと同様に、テンプレート宣言にループがあるなどの理由で、それが機能しない理由もありません。これは、問題の最小化されたバージョンです。どんな助けでもいただければ幸いです!T datastorage_containerstorage_container_implcontainer_ref

4

1 に答える 1

1

私はそれが完璧な解決策ではないことを知っていますが、あなたは置き換えることを試みることができます

typedef impl_storage_container<data_c<int, impl_storage_container> > c_storage_container;

typedef impl_storage_container<data_c<int, storage_container_impl> > c_storage_container;

コンパイルして動作します。そうしないと、無限の型再帰が発生します。

于 2012-07-19T10:42:53.883 に答える