Man*_*726 3 c++ templates crtp variadic-templates c++11
我目前正在实现一个通用事件类.事件处理程序具有sender参数和可变数量的事件args.所以事件类的声明如下:
template<typename SENDER , typename... ARGS>
class event;
Run Code Online (Sandbox Code Playgroud)
为了允许某些实现细节,我需要一个事件的CRTP,如下所示:
template<typename SENDER , typename... ARGS>
class event : public CRTPBase<event<SENDER,ARGS...>> { ... };
Run Code Online (Sandbox Code Playgroud)
CRTP基础需要知道事件参数.所以我尝试了模板模板参数:
template<typename SENDER , template<typename SENDER , typename... ARGS> class EVENT, typename ARGS>
class CRTPBase { ... };
Run Code Online (Sandbox Code Playgroud)
但这不起作用(我使用GCC 4.8.1).
那么:提取CRTP参数的可变参数和非可变参数模板参数的最佳方法是什么?
编辑:另一种方法是直接通过CRTP模板(template<typename EVENT , typename EVENT_SENDER , typename... EVENT_ARGS> class CRTPBase;)提供事件参数,但我认为有一种方法可以直接执行此操作,而无需以明确的方式写入参数.
您可以保留CRTPBase未定义的主模板:
template<typename T> class CRTPBase;
Run Code Online (Sandbox Code Playgroud)
然后以这种方式部分专门化:
template<template<typename, typename...> class TT,
typename SENDER, typename... ARGS>
class CRTPBase<TT<SENDER, ARGS...>>
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
这是一个简单的程序,显示可以在以下位置检索的类型参数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, "!");
}
Run Code Online (Sandbox Code Playgroud)
这是相应的实例.