boost 相关问题

Boost是一系列旨在用于C ++的高质量库。 Boost是免费的,通常被认为是“第二标准库”。

如何在 boost::unordered_flap_map 中使用异构类型

Boot unordered_flat_map 非常好,它比 std::unordered_map 快得多。我正在尝试将它与异构类型一起使用: boost::unordered::unordered_flat_map my_map; 我...

回答 1 投票 0

如何在主目录中创建文件夹?

我想创建一个目录路径=“$HOME/somedir”。 我尝试过使用 boost::filesystem::create_directory(path),但它失败了 - 显然该函数不会扩展系统变量。 怎么可以...

回答 2 投票 0

有没有办法将boost::json::serializer切换为美化输出?

使用 boost::json::serializer 如文档中的示例所示 - 快速查看以紧凑格式保存 json 树。 有没有办法指示序列化器输出人类可读的文件(即使用

回答 1 投票 0

将带有 2 个参数的类成员函数传递给 boost bind

Boost 绑定无法推导/替换模板参数: A级 { ... bool f(boost::shared_ptr>&, size_t); ... }; 一个我的A; 升压::绑定(&A:...

回答 1 投票 0

如何正确退出使用Boost Log的程序?

下面的示例程序工作正常,但 valgrind 显示,退出后仍然可以访问 6 个块中的 520 字节。 #包括 #包括 #包括 下面的示例程序工作正常,但是 valgrind 显示,退出后仍然可以访问 6 个块中的 520 字节。 #include <iostream> #include <string> #include <boost/log/common.hpp> #include <boost/log/sources/logger.hpp> #include <boost/log/utility/setup/file.hpp> #include <boost/phoenix/bind/bind_member_function.hpp> #include <boost/shared_ptr.hpp> namespace bl = boost::log; namespace bp = boost::phoenix; enum class MySeverityLevel { panic, alert, critical, error, warning, notice, info, debug }; BOOST_LOG_ATTRIBUTE_KEYWORD(Severity, "Severity", MySeverityLevel) BOOST_LOG_ATTRIBUTE_KEYWORD(Channel, "Channel", std::string) class Logger { public: Logger(const std::string& CH, const MySeverityLevel SEV): m_log(bl::keywords::channel = CH), m_channel(CH), m_severityMax(SEV) { m_sink = bl::add_file_log ( bl::keywords::file_name = CH + ".log", bl::keywords::filter = bp::bind(&Logger::filter, this, Channel.or_none(), Severity.or_none()) ); } ~Logger() { this->terminate(); } void terminate() { if (m_sink) { bl::core::get()->remove_sink(m_sink); m_sink->flush(); m_sink.reset(); } } void panic(const std::string& S) { BOOST_LOG_SEV(m_log, MySeverityLevel::panic) << S; } void debug(const std::string& S) { BOOST_LOG_SEV(m_log, MySeverityLevel::debug) << S; } private: using ChannelValue = bl::value_ref<std::string, tag::Channel>; using MySeverityLevelValue = bl::value_ref<MySeverityLevel, tag::Severity>; bool filter(const ChannelValue& CH, const MySeverityLevelValue& SEV) const { if (CH && SEV) { return (CH.get() == m_channel) && (SEV.get() <= m_severityMax); } else { return false; } } bl::sources::severity_channel_logger<MySeverityLevel, std::string> m_log; boost::shared_ptr<bl::sinks::sink> m_sink; const std::string m_channel; const MySeverityLevel m_severityMax; }; int main() { Logger lgA("A", MySeverityLevel::error); lgA.panic("A: Panic"); lgA.debug("A: Debug"); lgA.terminate(); } 这就是 valgrind 输出: hekto@ubuntu:~$ valgrind --leak-check=full --show-leak-kinds=all ./tc0013 ==48934== Memcheck, a memory error detector ==48934== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==48934== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info ==48934== Command: ./tc0013 ==48934== ==48934== ==48934== HEAP SUMMARY: ==48934== in use at exit: 520 bytes in 6 blocks ==48934== total heap usage: 83 allocs, 77 frees, 97,276 bytes allocated ==48934== ==48934== 8 bytes in 1 blocks are still reachable in loss record 1 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x4E98C61: boost::log::v2_mt_posix::sources::aux::get_severity_level() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x11723B: boost::log::v2_mt_posix::sources::aux::severity_level<MySeverityLevel>::set_value(MySeverityLevel) (severity_feature.hpp:135) ==48934== by 0x115E74: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:252) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== 8 bytes in 1 blocks are still reachable in loss record 2 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x4E9EF69: boost::log::v2_mt_posix::aux::this_thread::get_id() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x4E8BB96: boost::log::v2_mt_posix::core::open_record(boost::log::v2_mt_posix::attribute_set const&) (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x118DEA: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:259) ==48934== by 0x11825B: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::open_record_with_channel_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&, boost::parameter::void_) (channel_feature.hpp:195) ==48934== by 0x1172B2: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (channel_feature.hpp:171) ==48934== by 0x115E8B: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:253) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== 16 bytes in 1 blocks are still reachable in loss record 3 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x512A5BA: boost::detail::add_thread_exit_function(boost::detail::thread_exit_function_base*) (in /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1) ==48934== by 0x4E98C9A: boost::log::v2_mt_posix::sources::aux::get_severity_level() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x11723B: boost::log::v2_mt_posix::sources::aux::severity_level<MySeverityLevel>::set_value(MySeverityLevel) (severity_feature.hpp:135) ==48934== by 0x115E74: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:252) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== 24 bytes in 1 blocks are still reachable in loss record 4 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x4E98C84: boost::log::v2_mt_posix::sources::aux::get_severity_level() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x11723B: boost::log::v2_mt_posix::sources::aux::severity_level<MySeverityLevel>::set_value(MySeverityLevel) (severity_feature.hpp:135) ==48934== by 0x115E74: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:252) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== 24 bytes in 1 blocks are still reachable in loss record 5 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x512A1BC: boost::detail::make_external_thread_data() (in /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1) ==48934== by 0x512A5AD: boost::detail::add_thread_exit_function(boost::detail::thread_exit_function_base*) (in /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1) ==48934== by 0x4E98C9A: boost::log::v2_mt_posix::sources::aux::get_severity_level() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x11723B: boost::log::v2_mt_posix::sources::aux::severity_level<MySeverityLevel>::set_value(MySeverityLevel) (severity_feature.hpp:135) ==48934== by 0x115E74: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:252) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== 440 bytes in 1 blocks are still reachable in loss record 6 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x512A03D: boost::detail::make_external_thread_data() (in /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1) ==48934== by 0x512A5AD: boost::detail::add_thread_exit_function(boost::detail::thread_exit_function_base*) (in /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1) ==48934== by 0x4E98C9A: boost::log::v2_mt_posix::sources::aux::get_severity_level() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x11723B: boost::log::v2_mt_posix::sources::aux::severity_level<MySeverityLevel>::set_value(MySeverityLevel) (severity_feature.hpp:135) ==48934== by 0x115E74: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:252) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== LEAK SUMMARY: ==48934== definitely lost: 0 bytes in 0 blocks ==48934== indirectly lost: 0 bytes in 0 blocks ==48934== possibly lost: 0 bytes in 0 blocks ==48934== still reachable: 520 bytes in 6 blocks ==48934== suppressed: 0 bytes in 0 blocks ==48934== ==48934== For counts of detected and suppressed errors, rerun with: -v ==48934== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 在我的实际应用程序中,Logger类位于库中,这就是为什么我需要正确终止它(终止由systemctl执行)。但是,在退出应用程序期间,我仍然在 syslog 中看到异常: terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::log::v2_mt_posix::system_error> >' 我认为找到一种方法在退出后摆脱这些“6个块中的520字节”将帮助我清楚地终止我的应用程序。 如何正确编写 terminate 函数(见上文) - 以便 不 使 Boost Log 内部的任何内容都可访问? 操作系统:Ubuntu 18.04.1 LTS 编译器:g++ 7.3.0 提升:1.65.1 Valgrind:3.13.0 tl;dr; boost.log 注定要失败,使用其他东西...... 这些调用堆栈中的特殊细节是重复调用boost::detail::add_thread_exit_function,它是boost::this_thread::at_thread_exit的实现,显然用于在线程即将结束时执行一些清理操作。然而,此函数不能与系统特定的线程结束 API 和函数(例如 exit)一起使用。如文档中所述: 特别是,从main()返回相当于调用exit(),因此不会调用任何用at_thread_exit()注册的函数 因此 boost.log 在从主线程调用时不会执行任何清理。此外,(除了其他丑陋的事情之外)boost.log 使用 Meyer 的单例来保存核心上下文的实例,因此库用户无法控制核心上下文(及其拥有的对象)的生命周期,并且容易出现静态[un]初始化顺序惨败。

回答 1 投票 0

如何从子状态机访问状态机元素?

我正在使用 boost::msm 在机器人应用程序中进行状态管理。我有一个外部状态机,用于控制主流程并包括空闲、操作和错误等状态。操作...

回答 1 投票 0

将 Boost python 与 libtorch 结合使用

我正在尝试使用 Boost python 从 C++ 代码创建一个 python 包。然而,当包含 libtorchin 代码时,生成的 python 包显示奇怪的错误,例如 Boost.Python.ArgumentE...

回答 1 投票 0

Boost.Beast WebSocket 服务器 - 客户端连接上出现“读取错误:I/O 操作已中止”

我正在使用带有 SSL 的 Boost.Asio 和 Boost.Beast 构建 WebSocket 服务器。服务器接受连接,但我遇到了客户端在连接后不久就断开连接的问题。电子...

回答 1 投票 0

在没有CMake查找模块的情况下查找Boost(CMP0167)

我使用CMake版本3.30.5。我的 Boost 项目现在在调用 CMake 时发出此警告: CMake 警告(开发)位于 euler16_power_digit_sum/CMakeLists.txt:3 (find_package): 策略 CMP0167 未设置:...

回答 1 投票 0

为什么 std::pair 作为 std::unordered_map 中的值与 boost::container::pmr::polymorphic_allocator 无法编译

背景 在一些多平台项目中,多态分配器已用于优化内存的使用。 它提供了很好的性能提升。 现在一切都很顺利,直到在旧版上完成测试为止

回答 1 投票 0

Boost::pfr - 从元组设置结构成员

我正在学习 C++ 中的反射,并遇到了 boost::pfr 库。 我想知道 - 是否可以从元组中设置每个结构字段?我尝试了这种方法,但出现错误:没有匹配的功能...

回答 1 投票 0

返回shared_ptr时如何实现协变返回类型?

使用命名空间提升; A类{}; B 类:公共 A {}; X类{ 虚拟shared_ptr foo(); }; Y 类:公共 X { 虚拟shared_ptr foo(); }; 返回类型不是

回答 4 投票 0

有没有一种简单的方法可以使 std::chrono::duration 的单位可配置?

我试图通过修改 boost::property_tree 解析的 xml 配置文件来设置报告 std::chrono::duration 的单位。我当前的非编译解决方案尝试这样做

回答 1 投票 0

使用member_hook的Boost.intrusive Push_back与原始对象的地址不匹配

使用list_member_hook<>的boost侵入式列表。 为什么下面的断言失败: #包括 #包括 使用命名空间 boost::intrusive; ...

回答 1 投票 0

为什么 boost asio tcp 解析器为异步解析创建线程

当我使用以下代码时,它会生成一个新线程。 solver_.async_resolve( 主机_、端口_、 野兽::bind_front_handler(&session::on_resolve,shared_from_this())); 但当我改变时...

回答 1 投票 0

boost 中的 gzip_compressor 似乎无法正确保存和加载压缩流

命名空间 io = boost::iostreams; void saveCompressedData(const std::string& file_path, const std::vector& bid, const std::vector& Ask, const std::vector...

回答 1 投票 0

boost asio单线程post()在使用poll()时不发布?

一切都在单个线程中处理 无效 GameClient::测试() { std::cout <<"called test" << std::endl; m_io_context.post([](){ std::cout << "test&...

回答 1 投票 0

如何使用 boost::fpr::for_each_field_with_name 实现嵌套结构的哈希图

我想创建一个方法来访问和访问嵌套结构,每个结构只保存双精度值,如下所示: 结构位置{ 双纬度; 双长; }; 结构人{ 双高; 窦...

回答 1 投票 0

clang:未定义的符号 boost::archive::archive_exception

我正在根据教程构建演示 https://www.boost.org/doc/libs/1_85_0/libs/serialization/doc/tutorial.html 我使用 cmake for VS22 和 clang-cl.exe 创建了该项目,以及 cmakefile.tx...

回答 1 投票 0

返回勒让德多项式系数的函数不够准确

我正在尝试编写一个返回第 n 个勒让德多项式的系数的函数。 // 存储以前的多项式以使递归过程更快 无序_地图 我正在尝试编写一个返回第 n 个勒让德多项式的系数的函数。 // store previous polynomials to make the recursive process faster unordered_map<int, vector<double>> legendre_cache; // Recursive function to compute the coefficients of the nth Legendre polynomial vector<double> legendre_polynomial(int n) { // uses Bonnet's recursion formula P_{n+1} = ( (2n+1) x P_n - n P_{n-1} )/(n+1) // Check if the result is already in the cache if (legendre_cache.find(n) != legendre_cache.end()) { return legendre_cache[n]; } // Base cases if (n == 0) { return { 1.0 }; // P0(x) = 1 } if (n == 1) { return { 1.0, 0.0 }; // P1(x) = x } // Get coefficients for P_(n-1) and P_(n-2) vector<double> Pn_minus_1 = legendre_polynomial(n - 1); vector<double> Pn_minus_2 = legendre_polynomial(n - 2); // Get the sizes of the vectors to n+1 Pn_minus_1.push_back(0.0); // P_{n-1} gets multiplied by x Pn_minus_2.insert(Pn_minus_2.begin(), 0.0); // P_{n-2} needs two leading digits Pn_minus_2.insert(Pn_minus_2.begin(), 0.0); // Calculate coefficients for P_n vector<double> Pn(n + 1, 0.0); // Initialize Pn with n+1 zeros // Using the recurrence relation to fill coefficients for (int k = 0; k <= n; k++) { Pn[k] += ((2 * n - 1) * Pn_minus_1[k] - (n - 1) * Pn_minus_2[k]) / n; } // Store the result in the cache before returning legendre_cache[n] = Pn; return Pn; } 该算法有效,因为我将其结果与 n = 10 以内的其他来源进行了比较。 然而,这个函数很快就会变得不准确,而且它的递归性质并没有给它带来好处: 在这里,我评估我的多项式并将其与“boost/math”库中的类似函数进行比较: int main() { cout << fixed << setprecision(15); // Example inputs int n = 48; double x = 0.9; cout << "Result of my function:" << endl; vector<double> coeffs = legendre_polynomial(n); double result = 0; int l = coeffs.size(); for (int i = l - 1; i >= 0; i--) { result += coeffs[l - i - 1] * pow(x, i); } cout << result << endl; cout << "Result of boost library:" << endl; cout << boost::math::legendre_p(n, x) << endl; return 0; } n 越大,我的函数就越不准确,直到 n = 45 左右时完全崩溃: 测试代码的输出: Result of my function: 0.151876441197771 Result of boost library: -0.106892037065314 我从 boost 网站 知道 boost 函数使用与我相同的递归方法。 因此,假设他们的功能有效,那么也应该可以改进我的功能。 感谢您的帮助。 编辑1: 需要明确的是,我评估多项式只是为了证明我的系数是错误的;我主要需要多项式的系数(勒让德高斯求积)。 据我了解库中的函数,我认为那里从未提到过系数;递归公式仅应用于特定的 x 值。 坦率地说,我还没有达到重写代码来提取系数的水平。 编辑2: 我所说的“该算法是有效的,因为我将它的结果与其他来源的结果进行了比较,最多为n = 10”,我怀疑如果没有准确性错误,该函数将会起作用。我认为由于舍入、除法、浮点导致的错误会因为递归而像滚雪球一样不断增加,直到函数变得不可用。 (我的问题是如何处理这个问题) 我认为您无法像您一样计算勒让德多项式在给定点的值,即直接使用多项式的系数。事实上,您将面临数值错误,因为当多项式的阶数很大时,double无法处理x与“巨大”系数的乘法。 相反,您可以直接依赖这些多项式的三项递推关系来计算给定点的值: #include <iostream> #include <iomanip> #include <boost/math/special_functions/legendre.hpp> int main(int argc, char* argv[]) { std::cout << std::fixed << std::setprecision(15); int n = argc>=2 ? atoi(argv[1]) : 48; double x = 0.9; double p0=1; double p1=x; for (size_t k=1; k<n; k++) { double tmp = ( (2*k+1)*x*p1 - k*p0) / (k+1); p0=p1; p1=tmp; } std::cout << "Result of my function:" << std::endl; std::cout << p1 << std::endl; std::cout << "Result of boost library:" << std::endl; std::cout << boost::math::legendre_p(n, x) << std::endl; return 0; } 可能的输出: Result of my function: -0.106892037065314 Result of boost library: -0.106892037065314

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.