我只想做以下事情:
template <typename T>
class gvar {
private:
T var;
public:
gvar(T var) : var(var) {}
};
std::stack<gvar> some_stack;
g ++吐出了关于gvar不是一种类型的各种错误。这可以通过一些相对简单的方式实现吗?我不想使用boost :: any / boost :: variant。
编辑:
澄清我想要的东西:
可以保存不同类型变量的std :: stack(只是原语很好)。
答案 0 :(得分:7)
因为gvar
不是类型,所以它是一个类型模板。您需要为其指定模板参数:
std::stack< gvar<int> > some_stack;
答案 1 :(得分:5)
您必须实例化模板类或以其他方式处理此模板。例如,您可以制作std::stack<gvar<int> >
,也可以尝试Boost::Any等解决方案。
答案 2 :(得分:3)
您只需指定要实例化gvar
的类型,例如:
std::stack<gvar<int> > some_stack;
答案 3 :(得分:2)
通常,如果你想要多态,你可以使用基类:
class GVarBase
{
public:
virtual ~GVarBase() {}
};
template <typename T>
class GVar: public GVarBase
{
public:
private:
T mVar;
};
std::stack< std::unique_ptr<GVarBase> > stack;
请注意,使用当前代码,即使std::stack< GVar<int> >
无效,也需要默认构造函数。
答案 4 :(得分:1)
如果您可以在有限的范围内受苦,那么您可以完全了解使用tuples可以查看的集合的长度。当然,您还需要提前知道类型。
boost::tuple<gvar<double>,gvar<int>,gvar<double> > myItems;
在您的情况下,最好将其表达为:
boost::tuple<double,int,double> myItems;
答案 5 :(得分:1)
没有。没有办法做你想做的事情。通过此尝试尝试解决的问题的更清晰可能允许我提供解决方法。
答案 6 :(得分:0)
似乎你需要这样的东西:
class gvar {
struct base_val {
virtual ~base_val() {}
};
template <class T>
struct con_value : base_val{
con_value(T val): value(val) {}
T value;
};
base_val *var;
public:
template <typename T>
gvar(T var) : var(new con_value<T>(var)) {}
template <typename T>
T* getValue() {
con_value<T> *ptr = dynamic_cast<con_value<T>*>(var);
if(ptr == NULL) return NULL;
return &ptr->value;
}
};
std::stack<gvar> some_stack;
(使用工作示例http://www.ideone.com/gVoLh链接到ideone)
这是简化的boost::any
,如果可以的话,只需使用boost::any
代替此。