我正在尝试为“任何”数据类型创建包装,以使它们具有称为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。
协方差仅适用于多态类型的指针/引用。
您确实快到了。 std::variant<T, std::vector<T>>
确实是正确的返回类型,并且您的get() { return data; }
实现也正确。从字面上看,唯一的大问题是所有get
覆盖的返回类型都应该为std::variant<T, std::vector<T>>
。