我正在尝试创建一个包含泛型向量的匿名联合,以便将其用作类中的成员,而无需命名union本身的type_name。
因此我可以在类中调用向量,如下所示:
vec.size();
但我的方法
template <typename T>
union{
std::vector<T> vec;
};
只会向我显示错误“没有名称的模板类”。结构也会发生这种情况。那么当它是通用的时候不喜欢匿名吗?
搜索结果只是给了我在命名结构中创建一个通用向量的选项,但是,除了我无法使其工作之外,我将失去匿名联盟的好处而我需要调用向量,例如如
struct_name.vec.size();
甚至
class_name.struct_name.vec.size();
我试图避免。
我想使向量通用,以便它可以存储整数或双精度,我不需要使用自己的特定数据类型声明两个不同的向量。除了学习泛型的一些原则之外,我还使用这种技术来实现较少的声明和存储使用。
答案 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_ptr或std::unique_ptr,或者std::optional
;请参阅this)。
另请参阅this或boost::any ...
请注意,除了RTTI之外,在C ++中编译时使用了输入信息。