【问题标题】:Change number of members depending on constructor called根据调用的构造函数更改成员数
【发布时间】:2016-12-22 21:03:36
【问题描述】:

我需要一个模板类,它有不同的成员,具体取决于调用的 ctor。 我设法得到了一个类,它有不同的成员使用 sfinae 和一个基类(我几乎像 SFINAE on member variable 那样做)。 现在我的问题是,我能否实现一个具有不同成员的单个模板类,具体取决于调用该类的哪个ctor? 也许有人可以知道如何实现这一目标。

编辑:我目前使用boost::variant,但问题是,变体中最大的对象很大,而最小的对象是指针。这是一个真正的性能问题,因为大多数时候指针都在变体中。

编辑二:如果这可以与 ctor 一起使用,那就太棒了,但如果不是,工厂功能也可以。

EDIT III(或我想要实现的目标): 我目前正在制作一个转换为 C++ 的 DSL。 因为我试图使多态成为可能,所以我只是将指针传递给函数。因为有些指针是引用计数的,有些指针是原始的,根据用户的需要,可以有 shared_pointers 和同一类的原始指针。这就是为什么我不能创建两个不同的类,因为如果在指针上调用一个函数,它应该是同一个函数,否则我必须重载所有函数,这会给我 2**n 个函数,当函数有 n 个参数时。 这就是为什么我试图创建一个类,它可以根据传递给 ctor 的内容来表示原始指针或 shared_ptr。

【问题讨论】:

  • 必须成为构造函数吗?可以改为工厂函数吗?
  • 这看起来是个奇怪的想法……你到底想做什么?
  • @ildjarn:正是我的想法 :-) 创建一个按需交付对象的生成器/工厂。
  • 如果工厂方法没问题,只需使用它:-)
  • @Exagon 如果您只管理原始指针和shared_ptr,我看不出您的boost::variant 中的“巨大”是什么?

标签: c++ templates c++11 c++14 sfinae


【解决方案1】:

您应该继续使用variant<>,但不要将巨大的类存储为对象,而是将其存储为指针:

boost::variant<common_case*, huge_class*>

既然您说您通常无论如何都会存储一个指针,这不会花费您任何费用,并且可以回收 100% 的浪费内存,因为所有对象指针的大小都相同。

【讨论】:

    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 2011-12-07
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2012-01-10
    相关资源
    最近更新 更多