首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRTP +可变模板+提取CRTP子类参数

CRTP +可变模板+提取CRTP子类参数
EN

Stack Overflow用户
提问于 2013-07-07 16:01:04
回答 1查看 763关注 0票数 3

Im当前实现了一个通用事件类。事件处理程序具有发送方参数和可变数量的事件args。因此,事件类的声明如下:

代码语言:javascript
复制
template<typename SENDER , typename... ARGS>
class event;

为了允许某些实现细节,我需要事件的CRTP,如下所示:

代码语言:javascript
复制
template<typename SENDER , typename... ARGS>
class event : public CRTPBase<event<SENDER,ARGS...>> { ... };

CRTP库需要知道事件参数。因此,我尝试了一个模板模板param:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-07 16:07:32

您可以保留CRTPBase的主模板未定义:

代码语言:javascript
复制
template<typename T> class CRTPBase;

然后以这种方式将其部分地专门化:

代码语言:javascript
复制
template<template<typename, typename...> class TT, 
    typename SENDER, typename... ARGS>
class CRTPBase<TT<SENDER, ARGS...>>
{
    // ...
};

下面是一个简单的程序,它显示可以在CRTPBase中检索类型参数

代码语言:javascript
复制
#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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17513744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档