有没有办法在 C++ 的代码级别延迟类型绑定?
Is there have a way to delay type binding at code level in C++?
我将通过 json 从服务器请求一些用户配置,其中包含两种类型的数据,例如 (usrID
、bool
) 和 (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。这种类型不需要事先知道类型(它不需要模板参数。)
我将通过 json 从服务器请求一些用户配置,其中包含两种类型的数据,例如 (usrID
、bool
) 和 (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。这种类型不需要事先知道类型(它不需要模板参数。)