进行double和std :: vector 协变量

问题描述 投票:0回答:2

我正在尝试为“任何”数据类型创建包装,以使它们具有称为IValue的公共接口,因此可以对任何具体值调用get()并返回具体数据类型的值。在最简单的情况下,我只想能够在get()double上调用std::vector<double>。以我的理解,这些数据类型需要是协变的(在我的代码中根本没有)。以下是我对代码的原始想象:

//template<typename T>
class IValue 
{
protected:
    // typedef std::variant<T, std::vector<T>> return_type; <- this was an approach
public:
    IValue() {}

    virtual int size() = 0;

    virtual /*some special type*/ get() = 0;
};


template<typename T>
class Scalar : public IValue<T> {
    T data = NULL;
public:

    Scalar(T new_data) : data(new_data) {}

    T get() { return data; }

    int size()  { return 1; }
};


template<typename T>
class Vector : public IValue<T> 
{
    std::vector<T> data;
public:

    Vector(std::vector<T> new_data) : data(new_data) {}

    std::vector<T> get() { return data; }

    T get_element(int index) { return data[index]; }

    int size()  { return data.size(); }
};

我正在VS17上使用c ++ 17。

c++ inheritance polymorphism covariance
2个回答
0
投票

协方差仅适用于多态类型的指针/引用。


0
投票

您确实快到了。 std::variant<T, std::vector<T>>确实是正确的返回类型,并且您的get() { return data; }实现也正确。从字面上看,唯一的大问题是所有get覆盖的返回类型都应该为std::variant<T, std::vector<T>>

© www.soinside.com 2019 - 2024. All rights reserved.