【发布时间】:2014-12-11 18:51:24
【问题描述】:
简介
说我有关注
class thing {
template<typename T> void method(T value) {}
}
我想要做的是将传递给value 的任何值存储为std::vector 或其他类型的任何值,并且不将其转换为模板类(因为无论如何这都不能解决我的问题)
我希望能够在不使用 boost 的情况下做到这一点(尽管我非常喜欢 boost,但我不会一直使用它)
尝试的想法
空指针
虽然我最初是使用void*,但是我会丢失对象的类型并且它最终可能不安全。
联合/结构
我的下一个想法是使用union/struct,如下所示:
union type_wrapper {
int a;
char f;
/* etc, etc, etc */
}
但是我会遇到与必须跟踪类型相同的问题,所以我确保它在使用时保持不变。
包装类
接下来我尝试的是一个类,它会在函数调用中返回类型,如下所示:
template<typename T>
class type_wrapper {
T getType() { return /* get value of type/pointer/object here */ }
/*Stored in some manner */
}
问题与仅类型本身相同,因为它不能存储在称为std::list<AClass> 的列表中,当它的类型为std::list<BClass> 或std::list<int> 等时
其他事情
我看过的所有其他示例都做了我正在做的事情,但希望您以一种或另一种方式跟踪对象的类型,或者使用 boost。
tl;博士
我可以尝试做什么,以便我可以传递int 类型的参数并将其存储到std::list 等中,同时使用相同的模板函数来传递'cheese' 类型的参数(一个假想的类专用于用奶酪填充你的程序)并将其存储到同一个列表中,等等
【问题讨论】:
-
你不能有一个异构的
std::list。充其量,你可以有一个std::list<A>,其中元素实际上是派生类B或C或D,它们都派生自A。如果你愿意,有boostclasses提供异构容器跨度> -
@Cyber 你能用一个例子发布你所说的作为答案吗?这个想法是我不使用 boost
-
为避免重复,请参阅我上面发布的链接,了解如何使用
boost来完成此操作的示例。 -
@Cyber 需要是
std::list<A*>(或类似名称)。 -
您尝试做的事情非常困难,因此使用
boost::variant是一个好主意。它在那里,它被调试,它工作。在这一点上,您是否会正确执行此操作是值得怀疑的。当你设法做到这一点时,无论如何你都会得到类似boost::variant的东西,除非你需要做很多工作才能到达那里。恕我直言,这不值得。
标签: c++