Im当前实现了一个通用事件类。事件处理程序具有发送方参数和可变数量的事件args。因此,事件类的声明如下:
template<typename SENDER , typename... ARGS>
class event;为了允许某些实现细节,我需要事件的CRTP,如下所示:
template<typename SENDER , typename... ARGS>
class event : public CRTPBase<event<SENDER,ARGS...>> { ... };CRTP库需要知道事件参数。因此,我尝试了一个模板模板param:
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; )提供事件参数,但我认为有一种方法可以直接这样做,而无需显式地写入params。
发布于 2013-07-07 16:07:32
您可以保留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, "!");
}这是对应的live example。
https://stackoverflow.com/questions/17513744
复制相似问题