在 C++ 中,如何在运行时打印变体中包含的类型?
我的用例:使用 pybind11 将值字典从 Python 传递到 C++ ,我想打印出接收到的类型。
最佳答案
您可以通过 std::visit
和一些类型名打印库(例如 Boost.TypeIndex)获得通用解决方案。示例性解决方案:
#include <iostream>
#include <type_traits>
#include <variant>
#include <boost/type_index.hpp>
int main()
{
std::variant<char, bool, int, double> v;
auto print_variant_type =
[](auto&& value)
{
using T = std::decay_t<decltype(value)>;
std::cout << boost::typeindex::type_id<T>().pretty_name() << std::endl;
};
v = 'a';
std::visit(print_variant_type, v); // prints out "char"
v = true;
std::visit(print_variant_type, v); // prints out "bool"
v = 1;
std::visit(print_variant_type, v); // prints out "int"
v = 1.0;
std::visit(print_variant_type, v); // prints out "double"
}
现场演示:https://godbolt.org/z/Web5zeGof
唯一的缺点是它可以为类型别名(例如 std::string
)的库类型打印“丑陋”的类型名称。可能更适合您的特定变体实例的替代方法可能是使用从变体索引到类型名称的映射:
using variant_type = std::variant<char, bool, int, double, std::string>;
static const std::array variant_type_names =
{ "char", "bool", "int", "double", "std::string" };
void print_variant_type(const variant_type& v)
{
assert(v.index() < variant_type_names.size());
std::cout << variant_type_names[v.index()] << std::endl;
}
int main()
{
variant_type v;
v = 'a';
print_variant_type(v); // prints out "char"
v = true;
print_variant_type(v); // prints out "bool"
v = 1;
print_variant_type(v); // prints out "int"
v = 1.0;
print_variant_type(v); // prints out "double"
v = std::string("some string");
print_variant_type(v); // prints out "std::string"
}
关于c++ - 在 C++ 中运行时获取变体中包含的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74386543/