Я пытаюсь создать класс 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.