3

現在、汎用イベント クラスを実装しています。イベント ハンドラーには、sender パラメーターと可変数のイベント引数があります。したがって、イベント クラスの宣言は次のようになります。

template<typename SENDER , typename... ARGS>
class event;

特定の実装の詳細を許可するには、次のようなイベントの CRTP が必要です。

template<typename SENDER , typename... ARGS>
class event : public CRTPBase<event<SENDER,ARGS...>> { ... };

また、CRTP ベースはイベント パラメータを認識する必要があります。だから私はテンプレートテンプレートパラメータを試しました:

template<typename SENDER , template<typename SENDER , typename... ARGS> class EVENT, typename ARGS>
class CRTPBase { ... };

しかし、これは機能しません (GCC 4.8.1 を使用しています)。

では、CRTP の引数の可変個および非可変個のテンプレート パラメータを抽出する最良の方法は何ですか?

編集:別の方法は、CRTP テンプレート ( template<typename EVENT , typename EVENT_SENDER , typename... EVENT_ARGS> class CRTPBase;) を介して直接イベント パラメーターを提供することですが、明示的な方法でパラメーターを書き込まずに、これを直接行う方法があると思います。

4

1 に答える 1

8

CRTPBase未定義のプライマリ テンプレートを残すことができます。

template<typename T> class CRTPBase;

そして、次のように部分的に特化します。

template<template<typename, typename...> class TT, 
    typename SENDER, typename... ARGS>
class CRTPBase<TT<SENDER, ARGS...>>
{
    // ...
};

型引数を で取得できることを示す簡単なプログラムを次に示しますCRTPBase

#include <tuple>
#include <type_traits>

template<typename T> class CRTPBase;

template<template<typename, typename...> class TT,
    typename SENDER, typename... ARGS>
class CRTPBase<TT<SENDER, ARGS...>>
{
    using type = std::tuple<SENDER, ARGS...>;
};

template<typename SENDER , typename... ARGS>
class event : public CRTPBase<event<SENDER,ARGS...>>
{
    // ...
};

struct X { };

int main()
{
    event<X, int, double> e;

    // This assertion will not fire!
    static_assert(std::is_same<
        decltype(e)::type,
        std::tuple<X, int, double>
        >::value, "!");
}

対応するライブの例を次に示します。

于 2013-07-07T16:07:32.513 に答える