c++ - 使用模板实现的通用类型容器

标签 c++ templates containers

我有一个类可以通用地容纳任何(原始)类型:

class Value
{
    private:
        int             i_value;
        unsigned int    ui_value;
        long            l_value;
        unsigned long   ul_value;
        short           s_value;
        float           f_value;
        double          d_value;
        char            c_value;
        bool            b_value;
        std::string     str_value;

        int type;

        void setValue(int value);
        void setValue(unsigned int value);
        void setValue(long value);
        void setValue(unsigned long value);
        void setValue(short value);
        void setValue(float value);
        void setValue(double value);
        void setValue(char value);
        void setValue(bool value);
        void setValue(std::string value);

    public:
        Value(int value);
        Value(unsigned int value);
        Value(long value);
        Value(unsigned long value);
        Value(short value);
        Value(float value);
        Value(double value);
        Value(char value);
        Value(bool value);
        Value(std::string value);

        Value(Value& other); //Copy Constructor
        ~Value();

        int getType();
        std::string toString(int format);

};

这很好,因为我可以做类似的事情:

Value * v1 = new Value(55);
Value * v2 = new Value(1.2);
Value * v3 = new Value("yes");
Value * v4 = new Value(true);

但是,如您所见,它非常丑陋;一切都重载以使其工作。我在想模板可以使它通用。但是,据我所知,您总是必须指定类型,这违背了该类的全部目的。

例如:

Value<int> * v1 = new Value<int>(55);
Value<double> * v2 = new Value<double>(1.2);
Value<string> * v3 = new Value<string>("yes");
Value<bool> * v4 = new Value<bool>(true);

如果我使用模板,我将无法再执行类似 vector<Value *> 的操作就像我以前一样。这是正确的,还是我遗漏了在这种情况下可能有所帮助的模板的某些方面?

最佳答案

您所需要的只是模板一的父基类:

class BaseValue
{
public:
    virtual ~BaseValue()
    {}
};

template<typename T>
class Value : public BaseValue
{
public:
    Value(const T& value)
        :m_value(value)
    {}
    void set(const T& value)
    {
        m_value = value; 
    }
    const T& get() 
    {
        return m_value; 
    }
    virtual ~Value()
    {}
private:
    T m_value;
};

std::vector<BaseValue*> values;
values.push_back(new Value<int>(1)); // int
values.push_back(new Value<double>(1.0)); // double
values.push_back(new Value<char*>("asdf")); // pointer to array on stack :(
values.push_back(new Value<char>('c')); // char

关于c++ - 使用模板实现的通用类型容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26104454/

相关文章:

c++ - 为什么STL函数使用节点的颜色来计算std::map节点前驱

c++ - 为什么构造函数优先于用户定义的运算符?

python - 计算 flask 模板中的行数

image - Kubernetes 部署 - 为图像拉取指定多个选项作为后备?

c++ - 为什么 CRC 和 C++ 代码版本的 CRC 计算不同?

c++ - 当 List<List<X>> 时,模板在 C++ 中删除

java - 在 Intellij 中为 Java 创建实时模板

css - 按钮不进入div?

c++ - 自定义容器应该有免费的开始/结束功能吗?

c++ - 字符串不使用 std::cout 打印