有没有办法在C ++中的代码级别延迟类型绑定?

时间:2019-08-10 11:08:12

标签: c++ auto

我要从服务器请求通过json进行一些用户配置,该服务器包含两种类型的数据,例如(usrIDbool)和(usrID,{{1} }。因此,我创建了两个映射来对两个具有相同名称的函数进行分类并重新加载,以将数据解析后放入相应的映射中。

为了完善起见,我使用了C ++ 11的int关键字来初始化一个没有赋值的变量,并通过parse函数赋值确定了上面提到的bool或int类型,以便调用重载函数直接存储它们。 但这会导致编译器错误,如果没有赋值,将无法使用自动变量。

auto

是否可以在C ++中实现上述逻辑?

2 个答案:

答案 0 :(得分:3)

不。在C ++中,自动变量类型解析和函数重载解析必须在编译时进行。您的isBool()大概是运行时值。因此,您所能做的就是:

if(isBool())
{
   setAppidConfig(usrId,fromStringtoBool());
}
else
{
   setAppidConfig(usrId,fromStringtoInt());
}

答案 1 :(得分:2)

auto允许您省略类型名称,并让编译器推断类型。根据您的情况,没有类型可以推断,因为没有赋值,因此无法推断出任何内容。

对于您的用例,您需要某种可以存储几种类型之一的变量类型。 Qt库具有QVariant,其他库通常也提供类似的功能。但是从C ++ 17开始,这种类型是由标准库std::variant直接提供的。

int usrId;
std::variant<bool, int> value;

if (isBool()) {
   value = fromStringtoBool();
} else {
   value = fromStringtoInt();
}

setAppidConfig(usrId, value);

setAppidConfig()函数将需要接受适当的variant参数:

void setAppidConfig(int usrId, std::variant<bool, int> value)
{
    // ...

    if (std::holds_alternative<int>(value)) {
        // It's a int.
        int i = std::get<int>(value);
    } else {
        // It's a bool.
        bool b = std::get<bool>(value);
    }
}

请注意,变体不仅可以容纳两种类型(例如,您可以使用std::variant<bool, int, std::string>。)

如果您需要可以容纳任何东西的物品,则可以使用std::any。这种类型不需要事先知道类型(它不需要模板参数。)