ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 广义混合

2019-08-26 14:05:36  阅读:203  来源: 互联网

标签:c c11 variadic-templates metaprogramming mixins


我正在写一些代码,我有一个类可以接受mixins作为可变参数模板参数.但是,我还需要mixins才能通过CRTP习惯用法访问基类.这是一个最不能满足我想要的例子:

template <template <class> class... Mixins>
class Foo : Mixins<Foo<Mixins...>>... {};

但是,我可能传递给Foo的mixin通常会有几个模板参数,如下所示:

template <class Derived, class Type1, class Type2>
class Bar
{
    Derived& operator()()
    {
        return static_cast<Derived&>(*this);
    }
};

如何更改Foo以便我可以从多个基类继承它,我控制每个基类接受的模板参数?如果我给Foo一个模板模板参数列表,以及要传递给它们的参数列表,那么我不知道如何将每个模板模板参数与其参数相关联.到目前为止,我想到了这样的事情,但我不知道如何继续下去.

template <template <class...> class T,
    template <class...> class... Ts>
class Foo : /* How do I retrieve the arguments? */

解决方法:

我不太清楚我是否理解了这个问题,所以请让我改一下,以便我们能够从正确的方向开始.

在典型的CRTP用例中,您需要将派生类型线程化到基类,同时将其他模板参数传递给各个基类.

也就是说,典型的基类将是:

template <typename Derived, typename X, typename Y>
struct SomeBase {
};

并且您需要创建类型,以便您可以控制X和Y,同时传递完整的Derived类.

我想我会使用apply技巧从Derived类的参数列表中提供的适配器动态生成基类.

template <typename Derived, typename X, typename Y>
struct SomeBase {};

template <typename X, typename Y>
struct SomeBaseFactory {
  template <typename Derived>
  struct apply { typedef SomeBase<Derived, X, Y> type; };
};

// Generic application
template <typename Fac, typename Derived>
struct apply {
  typedef typename Fac::template apply<Derived>::type type;
};

然后,您将创建类型:

typedef MyFoo< SomeBaseFactory<int, float> > SuperFoo;

其中Foo定义为:

template <typename... Args>
struct Foo: apply<Args, Foo<Args...>>::type... {
};

而且仅仅因为我在模板中如此深入地研究了一段时间,I checked it worked.

当然,Factory本身并不是特定于给定类型的特定类型,因此我们可以重用您尝试过的包装器方法:

template <template <typename...> class M, typename... Args>
struct Factory {
  template <typename Derived>
  struct apply { typedef M<Derived, Args...> type; };
};

是的,it works too.

标签:c,c11,variadic-templates,metaprogramming,mixins
来源: https://codeday.me/bug/20190826/1730797.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有