古い質問を維持する。解決方法については以下を参照してください。 これはおそらく単純なことですが、まだまだです。C++ 11可変テンプレートテンプレートパラメータ
#include <vector>
template <typename... Ts>
struct typelist
{
};
template <typename T>
struct EventContainer
{
typedef T Type;
/// TODO. Ring buffer
std::vector<T> container;
void push(const T& t)
{
EventContainer<T>::container.push_back(t);
}
virtual ~EventContainer()
{
}
};
template <template <typename...> class TL>
class EventStorage:
public EventContainer<Ts>...
{
};
class Event1
{
};
class Event2
{
};
typedef typelist<Event1,Event2> Events12;
int main()
{
EventStorage<Events12> ev;
return 0;
}
がどのように私はtypelist
内の各タイプにtempleted EventStorage
継承EventContainer
を行うことができます。私は、次のC++ 11のコード・フラグメントを持っています。私はLoki :: libraryでそれを行うことができましたが、私は可変的なテンプレートでC++ 11を使いたいと思います。 ありがとうございます。
解像度1:固定EventStorage
テンプレートテンプレートの問題。これにより、EventStorage
が、の各タイプでテンプレート化されたEventContainer
のすべてを継承します。
template <typename...>
class EventStorage
{
};
template <typename... Ts>
class EventStorage < typelist<Ts...> >:
public EventContainer<Ts>...
{
};
今、私は次のようmain()
に、時間エラーをコンパイルしている:
int main()
{
EventStorage<Events12> ev;
Event1 ev1;
ev.push(ev1);
return 0;
}
In function ‘int main()’:
error: request for member ‘push’ is ambiguous
error: candidates are: void EventContainer<T>::push(const T&) [with T = Event2]
error: void EventContainer<T>::push(const T&) [with T = Event1]
コンパイラが混乱しているのはなぜ?結局、私は特定のタイプでプッシュします。 GCC 4.6.1はこちら。
RESOLUTION2: @Matthieu M.私は転送方式int型EventStorage
を提示しますが、1つの余分functinコールのコストで可能で示唆したように:
template <typename T>
void push(const T& t)
{
EventContainer<T>::push(t);
}
をアレキによると、コンパイラは、このコール転送を最適化しますパラメータが参照である限り。 質問は正式に終了しました:)
私は、さまざまな種類の「イベント」置換を粒状化することができたらいいですね。例えば。 'typedefタイプリスト pumpEvents; ' typedefタイプリスト displayEvents; ' あなたはそれをこのように置くと、2つの 'タイプリスト'を組み合わせることができます。それらを両方とも保存する。 –
「タイプリスト」アダプタとストレージコンビネータを含むように私の答えを編集しました。 –
ありがとうございます。私は、私の他の人からこのあいまいさの問題を解決した後、それを試してみます。それは非常に奇妙です。 'push()'にオーバーロードされていませんか? –