繁体   English   中英

具有通用/模板化变量的STL容器

[英]STL container with generic/templated variables

我只想做以下事情:

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,可以保存不同类型的变量(只是原语很好)。

因为gvar不是类型,所以它是一个类型模板。 您需要为其指定模板参数:

std::stack< gvar<int> > some_stack;

您必须实例化模板类或以其他方式处理此模板。 例如,您可以创建一个std::stack<gvar<int> > ,或者您可以尝试使用Boost :: Any等解决方案。

您只需指定实例化gvar类型,例如:

std::stack<gvar<int> > some_stack;

通常,如果您想要多态,则使用基类:

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> >不起作用,也需要默认构造函数。

如果您可以在有限的范围内受苦,那么您可以完全了解使用元组可以查看的集合的长度。 当然,您还需要提前知道类型。

boost::tuple<gvar<double>,gvar<int>,gvar<double> > myItems;

在您的情况下,最好将其表达为:

boost::tuple<double,int,double> myItems;

不,没有办法做你想做的事。 通过此尝试尝试解决的问题的更清晰可能允许我提供解决方法。

看来你需要这样的东西:

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代替。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM