Как создать класс Variant, аналогичный классу QVariant - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь создать класс Variant, подобный QVariant Qt. Я рассмотрел std :: variable и 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’

Этот ответ , кажется, является тем, что я хочу, но я пытаюсь понять, почему эта реализация работает без получения ошибки "deduce template параметр '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;
}

EDIT.

1 Ответ

0 голосов
/ 29 августа 2018

Ошибка исходит от вашего сайта вызовов, а не от определения класса. И ошибка говорит вам, что Variant::value<T>() нужен <T>, но вы не указали аргумент типа, с помощью которого можно создать экземпляр value<T>.

Это же ограничение распространяется на QtVariant, оно не уникально для вашего класса.

...