1

私はシミュレータで作業しています。このシミュレータは、入力として2種類のモデル、行動、および構造を受け取ります。C++ 14でオプションのテンプレートパラメータを持つ型のタプルを作ることは可能ですか?

動作モデルは、いくつかの必要な機能を提供し、テンプレートパラメータ「TIME」を必要とするクラスです。

構造モデルは、一連のモデル(行動または構造)とそれらの間の相互作用のリストです。構造モデルは動作を提供しないため、TIMEのパラメータは必要ありません。行動モデルの

例:構造モデルの

template<typename TIME> 
struct B {...}; 

例:

template<typename connections, typename Ms> 
struct S { 
    template<typename TIME> 
    using models=typename Ms::template type<TIME>; 
    ... 
}; 

主な問題は、ここで "モデル" です。 そこにリストされているように、すべてのモデルはTIMEテンプレートパラメータを取得し、私が望むだけ多くのBモデルを取得できます。しかし、私はそれにSモデルを渡すことはできません。 models_tupleの

私の実装では、次の

template<template<typename TIME> class... Ms> 
struct models_tuple { 
    template<typename T> 
    using type=std::tuple<Ms<T>...>; 
}; 

は、私はタプルがそれなしで、テンプレートパラメータ(時間)と他の人とクラスの両方を受信することができます方法はありますか? 私はクラスが関数の実装の要件をカバーしていることを検証するためにstatic_assertを使用しています。

答えて

4

テンプレートテンプレートパラメータとテンプレートタイプパラメータを混在させることはできません。しかし、前者をタイプにラップすることができます。あるべきmodels_tuple<wrap<B>, S</*...*/> /*, etc. */>.

+0

'テンプレートクラスB'としてそれを

template<class W, class> struct maybe_apply_time { using type = W; }; template<class T, template<class> class B> struct maybe_apply_time<wrap<B>, T> { using type = B<T>; }; template<class... Ms> struct models_tuple { template<typename T> using type=std::tuple<typename maybe_apply_time<Ms, T>::type...>; }; 

そして使用しています:

template<template<class> class B> struct wrap {}; 

その後、時間を追加しますが、それは種類の第一種のラッパーだ場合にのみ、テンプレートテンプレートのパラメータについてはデフォルトのフォームです。これにより、ユーザは、例えば、 'wrap '。 –

+1

@LucDantonまた、 'wrap 'を実行し、使用時ではなく機械の内部で爆発させることができます。デフォルトでなければならないと確信していません。 –

+1

@LucDanton: 'template default_vector = std :: vector ;を使っていますし、通常の' vector'を可能にするため 'wrap 'しています。 – Jarod42

関連する問題