C ++不自动返回字符串或整数

时间:2018-12-04 20:34:47

标签: c++ sql sqlite

我正在编写带有Column类的SQL控制器。 Column类具有属性

  1. 名称(字符串)
  2. 类型(枚举列表)
  3. 索引(行中)

但是值可以是字符串或整数。在 reality 中,无论如何在sqlite中,所有值都以char数组的形式返回。但最后,我希望用户能够执行类似的操作

Column column = row->GetColumn(1);
value = column->GetValue();

现在我无权访问auto,所以我什至不知道如何在任何级别上处理此问题,无论是从调用方(他们如何知道值类型是什么?)列类。

1 个答案:

答案 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 ...
}