我如何才能拥有一个模板元素的容器
How can I have a container of template elements
我试图拥有一个模板元素的容器,但它没有编译,因为第一个参数没有给定
所以我想把以下类放在std::map 中
template <typename T>
class TemplateParam
{
ITemplateParam<T> param_;
public:
TemplateParam(T value)
{
if (sizeof(value) >= sizeof(void*))
param_ = ptrTemplateParam<T>(value);
else
param_ = cpyTemplateParam<T>(value);
}
const T &getParam() const { return param_.getParam(); }
};
ITemplateParam
template <typename U>
class ITemplateParam
{
public:
virtual ~ITemplateParam(){}
virtual const U& getParam() const = 0;
};
我想我理解为什么我不能把不同大小的元素放在一个容器里,这就是我使用ptrTemplateParam
和cpyTemplateParam
的原因。(我也尝试过shared_ptr)
你知道我该如何解决的问题吗
我可以使用增强库
我已经看了这个链接,但我不知道如何声明getter。
编辑:
感谢你的回答,我可以将其存储在地图中,但我无法在地图中插入元素,我必须使用void*
所以我把我的课改成了:
class ITemplateParam
{
public:
virtual ~ITemplateParam(){}
virtual const void *getParam() const = 0;
};
template <typename U>
class ptrTemplateParam : public ITemplateParam
{
U param_;
public:
ptrTemplateParam(U & param) : param_(param) {}
virtual const void *getParam() const { return param_; }
};
class TemplateParam
{
std::shared_ptr<ITemplateParam> param_;
public:
template <typename T>
TemplateParam(T value): param_(ptrTemplateParam<T>(value))
{
}
const void *getParam() const { return param_->getParam();}
};
我试着做
std::map<std::string, TemplateParam> m_;
m_["integer"] = TemplateParam(5);
第2版boost::any是解决方案
如果您需要一个包含不同类型元素的容器,那么您可以基本上有三种方式:
- 有一个装有变体或接头的容器
- 拥有多态指针或多态智能指针的容器
- 使用侵入式容器
从你的问题中还不清楚什么对你最有利。
IMHO,如果你想把不同的项目放在同一个容器中,你应该考虑使用Boost.Variant。这不是对你这里的实际例子的直接回答,但我发现这种模式对这类问题非常有用。您可以避免以优雅的方式使用指针和强制继承。
class A {};
class B {};
typedef boost::variant<A, B> item_t;
...
vector<item_t> my_container;
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 我有一个嵌套数组,它由另一个数组中的元素组成,这些元素分组为2.之后,我想显示每个元素的属性
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 为什么只有在向量中已经有一个元素时才调用移动构造函数?
- 我有一个包含几个重复元素的数组,我想找到最接近数组末尾的重复元素的索引
- 是否可以有一个带有模板元素的类成员数组
- 是否有一个标准容器允许在不使迭代器无效的情况下插入元素
- 在std::multiset中,如果找到一个元素,有一个函数或算法可以只擦除一个样本(单播或重复)
- 从Cocos2d::Layer派生的类有一个指针数据成员.这个元素也有一个向量容器.调用vector::push_bac
- 我有一个类的数组,我想访问它的元素
- 我有一个STL向量的列表,我想按照每个向量的第一个元素对它们进行排序
- 找出两个范围(其中一个已排序)是否有一个公共元素