拿着一个普通传染媒介的匿名联合/结构

时间:2014-02-03 20:08:12

标签: c++ generics vector unions anonymous

我正在尝试创建一个包含泛型向量的匿名联合,以便将其用作类中的成员,而无需命名union本身的type_name。

因此我可以在类中调用向量,如下所示:

vec.size();

但我的方法

template <typename T>
union{
  std::vector<T> vec;
};

只会向我显示错误“没有名称的模板类”。结构也会发生这种情况。那么当它是通用的时候不喜欢匿名吗?

搜索结果只是给了我在命名结构中创建一个通用向量的选项,但是,除了我无法使其工作之外,我将失去匿名联盟的好处而我需要调用向量,例如如

struct_name.vec.size();

甚至

class_name.struct_name.vec.size();

我试图避免。

我想使向量通用,以便它可以存储整数或双精度,我不需要使用自己的特定数据类型声明两个不同的向量。除了学习泛型的一些原则之外,我还使用这种技术来实现较少的声明和存储使用。

1 个答案:

答案 0 :(得分:0)

你无法可靠地做你想做的事。如果你有一个int向量或一个float向量,你至少需要在运行时区分一些方法。

使用C ++ 11,您可以编码

class StrangeVector {
    bool has_int;
    union {
       std::vector<int> vint;
       std::vector<float> vfloat;
    };
public:
    StrangeVector(bool withints) : has_int(withints) {
       if (withints) new(&vint) std::vector<int>();
       else new(&vfloat) std::vector<float>();
    };
    ~StrangeVector {
       if (has_int) vint.~std::vector<int>();
       else vfloat.~std::vector<float>();
    }
}

但是这样的代码真的很难闻。 (我建议使用指针联合,可能是智能指针,例如std::shared_ptrstd::unique_ptr,或者std::optional;请参阅this)。

另请参阅thisboost::any ...

请注意,除了RTTI之外,在C ++中编译时使用了输入信息。