我正在编写带有Column类的SQL控制器。 Column类具有属性
但是值可以是字符串或整数。在 reality 中,无论如何在sqlite中,所有值都以char
数组的形式返回。但最后,我希望用户能够执行类似的操作
Column column = row->GetColumn(1);
value = column->GetValue();
现在我无权访问auto
,所以我什至不知道如何在任何级别上处理此问题,无论是从调用方(他们如何知道值类型是什么?)列类。
答案 0 :(得分:4)
让GetValue()
返回一个std::variant
(如果使用的是C ++ 17以前的编译器,则返回boost::variant
),并根据实际的SQL类型填充正确的数据。然后,调用者可以根据变量中实际存储的内容从变量中提取数据:
typedef std::variant<std::monostate, int, std::string, and_so_on...> SQLValue;
...
SQLValue value = column->GetValue();
if (std::holds_alternative<std::monostate>(value))
{
// you can use this for null data...
}
else if (std::holds_alternative<int>(value))
{
int ivalue = std::get<int>(value);
...
}
else if (std::holds_alternative<std::string>(value))
{
std::string svalue = std::get<std::string>(value);
...
}
else ...
或者:
SQLValue value = column->GetValue();
if (std::get_if<std::monostate>(&value))
{
// you can use this for null data...
}
else if (int *p_ivalue = std::get_if<int>(&value))
{
int ivalue = *p_ivalue;
...
}
else if (std::string *p_svalue = std::get_if<std::string>(&value))
{
std::string svalue = *p_svalue;
...
}
else ...
或者:
SQLValue value = column->GetValue();
switch (value.index())
{
case 0:
{
// you can use this for null data...
break;
}
case 1:
{
int ivalue = get:::get<1>(value);
...
break;
}
case 2:
{
std::string svalue = std::get<2>(&value);
...
break;
}
case ...
}