像 PHP 中的 var_dump() 这样的C++转储设施?新解决方案旧响应
当我在大学时,我做了一些C / C++,但在不久的将来,我在PHP工作,现在我希望花更多的时间学习C / C++。
在PHP中,我使用print_r()或var_dump()来显示来自结构或数组的数据。我在C中是否有这样的默认功能,以便查看结构或数组中有什么?
当我在大学时,我做了一些C / C++,但在不久的将来,我在PHP工作,现在我希望花更多的时间学习C / C++。
在PHP中,我使用print_r()或var_dump()来显示来自结构或数组的数据。我在C中是否有这样的默认功能,以便查看结构或数组中有什么?
C++中没有这样的功能。你当然可以编写自己的 Dump() 函数。通常无法提供此类功能的原因是,C++编译过程会删除构建转储输出所需的对象元数据。当然,您可以在调试器中显示结构内容,其中此类元数据保留在调试信息中。
顺便说一句,你是在问C还是C++?这两种语言在功能和方法上都有很大的不同,尽管两者都没有var_dump()或类似。
C++本身并不能提供像var_dump这样的东西,但是对于像Boost.Fusion这样的库以及ADAPT_STRUCT和ADAPT_ADT设施,这很容易实现。
事实上,正如在另一个响应中所说,C++编译器不会生成生成此类输出所需的元数据。但是,可以生成这些元数据并使用一些模板元编程来使用它们。
通过这种方式,我在这里实现了一个adapted_struct_printer,它可以打印std::container,任何类或结构,boost::variant和boost::tuple。
现在,您可以轻松执行以下操作:
#include <iostream>
#include <pre/json/to_json.hpp>
struct customer {
std::string name;
size_t money_spent;
std::vector<std::string> interests;
};
BOOST_FUSION_ADAPT_STRUCT(customer,
name,
money_spent,
interests)
...
customer my_customer{
"Mr. Dupond",
1000,
{"sport articles", "food", "tools"}
};
std::cout << pre::json::to_json(my_customer) << std::endl;
与此库相反,您还可以执行from_json以从 json 填充结构。
唯一的要求是您在课程上调用BOOST_FUSION_ADAPT_STRUCT/BOOST_FUSION_ADAPT_ADT(请参阅 http://www.boost.org/doc/libs/1_57_0/libs/fusion/doc/html/fusion/adapted.html)
所以这个例子:
#include <iostream>
#include <swissarmyknife/boost/fusion/adapted_struct_printer.hpp>
#include <boost/fusion/include/define_struct.hpp>
#include <boost/variant.hpp>
#include <boost/tuple/tuple.hpp>
namespace bla {
struct someclass {
int i = 12;
int j = 15;
};
using boost::fusion::detail::operator <<;
}
BOOST_FUSION_ADAPT_STRUCT(bla::someclass,
(int, i)
(int, j)
)
BOOST_FUSION_DEFINE_STRUCT((bla), innerbim,
(std::string, mystring)
)
BOOST_FUSION_DEFINE_STRUCT((bla), bimbim,
(int, boom)
(int, bam)
(bla::innerbim, my_inner_bim)
)
typedef boost::variant<int, double, bla::innerbim> myvariant_t;
typedef boost::tuple<std::string, int, bla::innerbim, myvariant_t> my_tuple_t;
BOOST_FUSION_DEFINE_STRUCT((bla), blabla,
(bla::bimbim, bim)
(int, i)
(int, j)
(std::vector<double>, list)
(std::list<bla::bimbim>, list_of_bimbim)
(my_tuple_t, mytuple)
(myvariant_t, myvariant)
)
int main(int argc, char** argv) {
using namespace swak;
bla::blabla instance{
{22, 12, bla::innerbim{"COOL"} },
23,
43,
{2.00, 39.07, 24.05},
{
{24, 9, bla::innerbim{"FEEL GOOD"} },
{26, 14, bla::innerbim{"SO BAD"} },
},
{"Hey that's not an int", 1, bla::innerbim{"hello"}, 12},
bla::innerbim("I'm in the variant")
};
std::cout << instance << std::endl;
bla::someclass otherinstance{};
std::cout << "Other instance : " << otherinstance << std::endl;
return 0;
}
打印出以下内容:
{
bim :
{
boom : 22,
bam : 12,
my_inner_bim :
{
mystring : COOL,
}
}
i : 23,
j : 43,
list : [2, 39.07, 24.05],
list_of_bimbim : [
{
boom : 24,
bam : 9,
my_inner_bim :
{
mystring : FEEL GOOD,
}
}
,
{
boom : 26,
bam : 14,
my_inner_bim :
{
mystring : SO BAD,
}
}
],
mytuple :
{
0 (Ss) : Hey that's not an int,
1 (i) : 1,
2 (N3bla8innerbimE) :
{
mystring : hello,
}
3 (N5boost7variantIidN3bla8innerbimENS_6detail7variant5void_ES5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_EE) :
{
12}
}
myvariant :
{
{
mystring : I'm in the variant,
}
}
}
Other instance :
{
i : 12,
j : 15,
}
我正在改进实现,以便在某个时候将其作为boost融合中可能的新功能,但它已经可用,如下所示: