如何创建类似于 QVariant 的变体类

How to create a Variant class similar to QVariant

本文关键字:QVariant 类似于 何创建 创建      更新时间:2023-10-16

我正在尝试创建一个类似于Qt的QVariant的变体类。我已经考虑过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’

这个答案似乎是我想要的,但我试图理解为什么该实现在没有收到返回类型上的"推断模板参数'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;
}

编辑。

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

同样的限制也适用于QtVariant,它不是你的类所独有的。