【发布时间】:2020-06-16 19:26:25
【问题描述】:
我想要做的是在从共享库调用某些函数之前将每个“VariantType”(不同类型的联合)参数转换为它的类型。到目前为止,我正在做的事情在下面。它只有 3 种不同的类型和 2 个参数,而且需要很多行。但我想用 7 种不同类型的变体参数来实现这一点。这与可变参数模板有关(另一个相关问题:Template tuple - calling a function on each element)。或者如果您知道更好的方法,请告诉我。
template<typename... T>
int call(const char* func_name, T... args) {
// this will call func_name(args...) somehow from a dll binary.
// If you need the implementation : https://hastebin.com/ocoyaniruj.cpp
}
int main(int argc, char** argv) {
const char* func_name = "func_name";
VariantType arg1 = "hello world!";
VariantType arg2 = 3.14;
if (arg1.get_type() == VariantType::INT) {
if (arg2.get_type() == VariantType::INT) {
call(func_name, (int)arg1, (int)arg2);
} else if (arg2.get_type() == VariantType::FLOAT){
call(func_name, (int)arg1, (float)arg2);
} else if (arg1.get_type() == VariantType::STRING){
call(func_name, (int)arg1, arg2.c_str());
}
} else if (arg1.get_type() == VariantType::FLOAT){
if (arg2.get_type() == VariantType::INT) {
call(func_name, (float)arg1, (int)arg2);
} else if (arg2.get_type() == VariantType::FLOAT){
call(func_name, (float)arg1, (float)arg2);
} else if (arg1.get_type() == VariantType::STRING){
call(func_name, (float)arg1, arg2.c_str());
}
} else if (arg1.get_type() == VariantType::STRING){
if (arg2.get_type() == VariantType::INT) {
call(func_name, arg1.c_str(), (int)arg2);
} else if (arg2.get_type() == VariantType::FLOAT){
call(func_name, arg1.c_str(), (float)arg2);
} else if (arg1.get_type() == VariantType::STRING){
call(func_name, arg1.c_str(), arg2.c_str());
}
}
return 0;
}
【问题讨论】:
-
这似乎是在同时重新发明两个轮子。第一个轮子称为
std::variant。第二个轮子称为std::visit。显示的代码都不是必需的,std::variant和std::visit。 -
或者如果您真的不能使用 C++17,请使用旧 C++ 版本的 Boost 版本
-
@SamVarshavchik 我会看看他们。非常感谢。
-
@underscore_d boost 变体是否适用于 std::visit ?
-
这个问题不成立。如果你可以使用
std::visit,你可以使用std::variant,如果你可以使用标准库版本而不是第三方库,你应该使用。所以,如果你可以使用任何一个,你应该同时使用,不需要混合和匹配
标签: c++ variadic-templates variant