gpt4 book ai didi

c++ - 在 C++ 中计算任何结构的简单方法

转载 作者:行者123 更新时间:2023-12-03 06:52:38 27 4
gpt4 key购买 nike

在 C++ 中,有没有办法定义一个打印每个结构的函数?我的意思是,在我们的项目中,有很多结构;我有时需要打印它们以进行调试。我希望它们可以轻松打印,而无需在每个结构中添加 friend ostream 函数。

struct type{
string name;
int id;
}
type aType;
aType.name= "sahin";
aType.id=10;
该功能可以像这样工作:
printStruct(aType);

output:
{
name:sahin
id:10
}
然后,如果可能的话,我需要一种打印结构 vector 的方法。
类似于 js 中的 JSON.stringify。

最佳答案

通常,您需要使用静态反射来遍历字段并打印它们,而 C++ 没有。
除非你真的很难破解语言。
一、你"scan" the struct用于字段计数

struct ubiq
{
template <typename T>
operator T();
};

template <size_t>
using ubiq_t = ubiq;

template <typename T, typename... Ubiqs>
constexpr auto count_r(size_t& sz, int) -> std::void_t<decltype(T{Ubiqs{}...})>
{
sz = sizeof...(Ubiqs);
}

template <typename T, typename, typename... Ubiqs>
constexpr auto count_r(size_t& sz, float)
{
count_r<T, Ubiqs...>(sz, 0);
}

template<typename T, size_t... Is>
constexpr auto count(std::index_sequence<Is...>)
{
size_t sz;
count_r<T, ubiq_t<Is>...>(sz, 0);
return sz;
}

template<typename T>
constexpr auto count()
{
return count<T>(std::make_index_sequence<sizeof(T)>{});
}
通过尝试使用 ubiq 初始化结构来工作s,一种对任何东西都有一个假的转换运算符的类型。结合 SFINAE,您可以检查需要多少个,这将是字段计数。
然后,为了在不知道其名称的情况下将字段提取为可用对象,我们可以使用结构化绑定(bind)。例如,对于两个字段,我们可以
template <typename T>
inline auto as_tuple(T&& t, std::integral_constant<size_t, 2>)
{
auto& [x0, x1] = t;
return std::forward_as_tuple(x0, x1);
}
不幸的是,这需要每个参数都有一个单独的函数。但是假设我们拥有我们需要的所有 arity,那么我们可以获取并使用这些字段作为
struct S { int x; std::string s; };
S s = {42, "42"};
auto tup = as_tuple(s, std::integral_constant<size_t, count<S>()>{});
std::cout << get<0>(tup) << ' ' << get<1>(tup);
现在,您所要做的就是将所有内容粘合在一起,使其自动打印任何聚合类型。
template<typename T>
void println(T&& t)
{
using rT = std::remove_reference_t<T>;
auto tup = as_tuple(t, std::integral_constant<size_t, count<rT>()>{});
std::apply([](auto&... xs) { ((std::cout << xs << ' '), ...); }, tup);
}
碰巧我已经写了一个库 ezprint为您(以及更多)做这件事。 end result你得到的是
ez::println(s);  // prints {42 42}
没有为自定义类型定义任何内容。

关于c++ - 在 C++ 中计算任何结构的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64777768/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com