如何创建类似于QVariant的Variant类

时间:2018-08-29 04:36:54

标签: c++ c++14 c++17

我正在尝试创建类似于Qt的QVariant的Variant类。我考虑过std :: variant和std :: any,但是不幸的是,我需要类似于QVariant :: value()函数的东西。但是,我找不到没有这样的错误的方法来实现该功能:

note: candidate: template<class T> T Variant::value() const
         inline T value() const {
                  ^~~~~
note:   template argument deduction/substitution failed:
note:   couldn't deduce template parameter ‘T’

这个answer似乎是我想要的,但是我试图理解为什么该实现在返回类型上没有收到“推导模板参数'T'”错误的情况下有效。任何帮助将不胜感激。谢谢。

这是我的.H:

class Variant {

private:

enum VariantType {
    CHAR = 0,
    UCHAR,
    SCHAR,
    SHORT,
    USHORT,
    INT,
    UINT,
    LONG,
    ULONG,
    LONGLONG,
    ULONGLONG,
    BOOL,
    FLOAT,
    DOUBLE,
    LONGDOUBLE
};

public:

explicit Variant(int i);
explicit Variant(double d);

int ToInt() const;
double ToDouble() const;

private:

struct Internal {

    Internal(VariantType typeIn) :
        type(typeIn) {
    }

    union {
        char c;
        unsigned char uc;
        short s;
        signed char sc;
        unsigned short us;
        int i;
        unsigned int ui;
        long l;
        unsigned long ul;
        long long ll;
        unsigned long long ull;
        bool b;
        float f;
        double d;
        long double ld;
        void *ptr;
    } value;
    VariantType type;
};

Internal _data;

public:

  template<typename T>
  inline T value() const {
     // try to get int/double working first
     if (_data.type == VariantType::DOUBLE) {
        return _data.value.d;
     } else if (_data.type == VariantType::INT) {
        return _data.value.i;
     }
  }
};

这是我的.CPP:

Variant::Variant(int i) : _data(INT) {
    _data.value.i = i;
}

Variant::Variant(double d) : _data(DOUBLE) {
    _data.value.d = d;
}

int Variant::ToInt() const {
    return _data.value.i;
}

double Variant::ToDouble() const {
    return _data.value.d;
}

编辑。

1 个答案:

答案 0 :(得分:3)

错误来自您的呼叫站点,而不是类定义。该错误告诉您Variant::value<T>()需要一个<T>,但是您没有提供任何用于实例化value<T>的类型参数。

此限制同样适用于QtVariant,并非您的班级独有。