这是我的(可能有点奇怪)想法,假设我想定义一个std::set
对象来包含一些东西以供以后使用,但不幸的是我不确定将哪种类型传递给{{ 1}}作为模板arg,这个std::set<not-sure>
类型将通过字符串确定,如下所示:
not-sure
这样,我可以确定class X {
public:
foo()
{
char not_sure_type[20];
scanf("%s", not_sure_type);
if (strcmp(not_sure_type, "int"))
// then std::set<int>
else if (// "char")
// then std::set<char>
}
private:
void * _set;
};
是否会被实例化,对吧?但是,如何告诉std::set<int>
您应该指向_set
?在不知情的情况下,我无法使用std::set<int>
来回static_cast
从_set
投射void *
。
那么我可以将std::set<int>*
保存为数据成员以供以后使用吗?
任何想法都表示赞赏。
答案 0 :(得分:5)
如果您在运行时知道set元素的类型(基于say字符串),您可以将指向抽象类型的指针存储到set(set)中,然后使用{{3在包含std :: set的类的构造函数中,根据提供的字符串在运行时实例化元素的实际混凝土类型。 问题在于使用原始指针,因为您需要在具有std :: set的类中进行清理。由于您要使用std :: set,请确保元素的Concrete Type是Comparable。不知道这是不是正确的方式..你说要投入想法......
答案 1 :(得分:0)
听起来像是在考虑使用c ++作为弱类型语言,比如python。确定可能有使用一些抽象基类等的变通方法,但我认为在运行时定义类型的底线是反对c ++的范例。