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

Is there have a way to delay type binding at code level in C++?

我将通过 json 从服务器请求一些用户配置,其中包含两种类型的数据,例如 (usrIDbool) 和 (usrID, int).所以,我创建了两个map来分类并重新加载两个同名的函数,将解析后的数据放入对应的map中。

为了细化,我使用了C++11的auto关键字来初始化一个没有赋值的变量,通过parse函数assigned来判断它的类型是上面提到的bool还是int,从而达到直接调用重载函数来存储它们。 但它会导致编译器错误,无法在没有分配的情况下使用自动变量。

bool fromStringtoBool() {……}
int  fromStringtoInt() {……}

void setAppidConfig(int,bool);
void setAppidConfig(int,int);
……
……
void main func()
{
    ……
    int usrId;
    auto value;
    if(isBool())
    {
       value = fromStringtoBool();
    }
    else
    {
       value = fromStringtoInt();
    }

    setAppidConfig(usrId,value)
    ……
}




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

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

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

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。这种类型不需要事先知道类型(它不需要模板参数。)