古い質問を保持します。解決策については、以下を参照してください。それはおそらく単純なことですが、それでもです。次の 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;
}
の各タイプでEventStorage
継承テンプレートを作成するにはどうすればよいですか。私は Loki:: ライブラリでそれを行うことができましたが、可変個引数テンプレートで C++11 を使用したいと考えています。ありがとうございました。EventContainer
typelist
EventStorage
解決策 1:テンプレート テンプレートの問題を修正します。これにより、 の各タイプでテンプレート化されたEventStorage
すべてが複数継承されます。EventContainer
Ts
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 はこちら。
解決策 2: @Matthieu M. が提案したように、転送メソッド int を提示できますEventStorage
が、追加の関数呼び出しが 1 つ必要です。
template <typename T>
void push(const T& t)
{
EventContainer<T>::push(t);
}
Alexandrescu によると、パラメーターが参照である限り、コンパイラーはこの前方呼び出しを最適化します。これで、質問は正式に終了しました:)