首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在可变模板递归基例中去掉不必要的类

在可变模板递归基例中去掉不必要的类
EN

Stack Overflow用户
提问于 2018-02-21 21:11:30
回答 1查看 111关注 0票数 0

下面的可变模板递归地创建类,并按顺序添加每个指定的成员:

代码语言:javascript
复制
class Dummy {};

template<class Base, typename... Members>
// using Composition = Base;
class Composition : public Base {};

template<class Base, typename FirstMember, typename... MoreMembers>
class Composition<Base, FirstMember, MoreMembers...>
    : public Composition<Base, MoreMembers...> {
protected:
    FirstMember member;
};

Composition<Composition<
    Composition<Dummy, int>, Composition<Dummy, int>*>, double> composition;

它可以工作,但我觉得终止步骤有点笨拙:它创建了一个继承自Base但不做其他任何事情的新类Composition<Base>。我更希望最后一步可以是template<class Base, typename... Members> using Composition = Base; -但这是不允许的,因为我们可能不会专门化别名模板。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-21 21:21:49

您可以只获取Dummy的tid,并将1个参数构成停止条件:

代码语言:javascript
复制
template<typename... Members>
class Composition;

template<typename FirstMember, typename... MoreMembers>
class Composition<FirstMember, MoreMembers...>
    : public Composition<MoreMembers...> {
protected:
    FirstMember member;
};

template<typename FirstMember>
class Composition<FirstMember>
{
protected:
    FirstMember member;
};

Composition<Composition<
    Composition<int>, Composition<int>*>, double> composition;

[Live example]

如果,正如评论中所阐明的那样,Base是设计的重要部分,那么您应该能够通过添加更多的间接层来实现您想要的功能:

代码语言:javascript
复制
template <class Base, class... Members>
struct CompositionHelper;

template <class Base, class... Members>
using Composition = typename CompositionHelper<Base, Members...>::Type;

template <class Base>
struct CompositionHelper<Base>
{
  using Type = Base;
};

template <class Base, class FirstMember, class... MoreMembers>
struct CompositionHelper<Base, FirstMember, MoreMembers...>
{
  class Type : public Composition<Base, MoreMembers...>
  {
  protected:
    FirstMember member;
  };
};

Composition<Composition<
    Composition<Dummy, int>, Composition<Dummy, int>*>, double> composition;

[Live example]

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

https://stackoverflow.com/questions/48906841

复制
相关文章

相似问题

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