c++中不相关T的容器
container of unrelated T in c++
如果我有以下假设类:
namespace System
{
template <class T>
class Container
{
public:
Container() { }
~Container() { }
}
}
如果我实例化两个具有不同T的容器,说:
Container<int> a;
Container<string> b;
我想创建一个指针指向a和b的向量。因为a和b是不同的类型,通常这是不可能的。但是,如果我这样做:
std::stack<void*> _collection;
void *p = reinterpret_cast<void*>(&a);
void *q = reinterpret_cast<void*>(&b);
_collection.push(a);
_collection.push(b);
然后,我可以像这样从_collection中得到a和b:
Container<string> b = *reinterpret_cast<Container<string>*>(_collection.pop());
Container<int> a = *reinterpret_cast<Container<int>*>(_collection.pop());
我的问题是,这是存储不相关类型集合的最佳方式吗?这也是存储和从向量中检索指针(重新解释转换)的首选方式吗?我已经环顾四周,看到boost有一个更好的方法来解决这个问题,boost::Any,但由于这是一个学习项目,我想自己做(我也很好奇找到一个很好的理由正确使用reinterpret_cast)。
如果您想要存储异构类型的对象,请考虑boost::any
或boost::variant
。
在决定使用哪一个之前,看一下比较:
- 提振。变体vs.增强。任何
希望它能帮助你做出正确的决定。从标准库中选择一个或任何容器来存储对象,std::stack<boost::any>
、std::stack<boost::variant>
或任何其他容器。
我重复不要编写自己的容器。使用标准库中的容器。他们经过。
虽然可以转换为void *
并返回,但问题是要知道要弹出的是哪种类型。毕竟,您给出的例子是:
Container<string> b = *reinterpret_cast<Container<string>*>(_collection.pop());
Container<int> a = *reinterpret_cast<Container<int>*>(_collection.pop());
然而,如果你不小心做了:
Container<int> a = *reinterpret_cast<Container<int>*>(_collection.pop());
Container<string> b = *reinterpret_cast<Container<string>*>(_collection.pop());
现在你得到了指向错误类型的指针,很可能会看到崩溃——甚至更糟。
如果你想做这样的事情,至少使用dynamic_cast
来检查你有正确的类型。使用dynamic_cast
,您可以让c++在运行时(使用RTTI)检查您的强制转换是安全的,只要被强制转换的类型(之前和之后)具有具有至少一个虚方法的公共基类型。
class ContainerBase {
public:
virtual ~ContainerBase() { }
};
让你的容器从它派生:
template <typename T>
class Container : public ContainerBase {
// ...
}
现在使用std::stack<ContainerBase *>
。当您从堆栈中检索项时,使用dynamic_cast<Container<int> >(stack.pop())
或dynamic_cast<Container<string> >(stack.pop())
;如果你有错误的类型,这些将检查,并将返回NULL。
也就是说,异构容器几乎总是错误的;在某种程度上,你需要知道容器中有什么,这样你才能真正地使用它。通过创建这样的容器,您实际想要完成什么?
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- std::less是否应该允许在编译时比较不相关的指针?
- 0 的 2D 数组 不相关循环的破坏逻辑 - C++
- 为什么数组到指针的输出不相关
- 如何使用模板元编程在自由函数C++链接两个不相关的类
- 为什么在使用不相关的宏时会阻止 while 循环结束?
- 将积分类型的数组作为另一个不相关的积分类型的阵列进行访问的安全且符合标准的方法
- 强制转换为不相关的引用类型是否违反严格的别名规则?
- 为什么我的代码在添加不相关的代码行后工作方式不同?
- 尝试编写函数尝试从字符串中提取数字,但它返回不相关的数字
- VSCODE C++ IntelliSense为替代定义找到不相关的Yocto Sysroots
- 什么保证两个不相关的线程中的不同不相关对象没有(不可避免的)争用条件?
- 对类型 'A *' 的非常量左值引用不能绑定到不相关的类型 'std::shared_ptr<A>' 的值
- 将函数从控制台应用程序移动到共享库项目似乎会带来不相关的编译错误
- 将不相关类型的对象reinterpret_cast空类是未定义的行为吗?
- 因为一行不相关的代码,速度相差那么大
- 对于循环重新分配完全不相关的变量
- 我可以使用 boost::bind 来存储不相关的对象吗?
- C++中的神秘:函数调用行为不端只是因为存在另一个函数调用,即使它们是不相关的