如何将boost::histogram作为类成员并在构造函数中初始化?
正确将boost::histogram作为类成员的方法
问题根源分析
你遇到的编译错误本质是类型不匹配:boost::histogram::histogram的第一个模板参数要求是轴类型的std::tuple——哪怕只有单个轴,也需要用tuple包裹。你之前的代码里axes_t直接使用单个axis::regular<>类型,和make_histogram返回的histogram类型(轴参数为tuple)不兼容,导致赋值操作触发编译错误。
正确解决方案
方案1:手动指定轴的tuple类型,用成员初始化列表构造
修正轴类型的定义,用std::tuple包裹轴类型,然后在构造函数的成员初始化列表中直接初始化histogram,避免默认构造后再赋值的冗余操作:
#include <boost/histogram.hpp> #include <tuple> struct HolderOfStaticHistogram { // 单个轴也要用tuple包裹 using axes_t = std::tuple<boost::histogram::axis::regular<>>; using hist_t = boost::histogram::histogram<axes_t>; hist_t hist_; // 成员初始化列表直接构造,仅初始化一次 HolderOfStaticHistogram() : hist_(boost::histogram::make_histogram(boost::histogram::axis::regular<>(5, 0, 1))) {} }; int main() { auto hist_container = HolderOfStaticHistogram(); }
方案2:用decltype推导类型,结合成员初始化列表避免重复构造
你的临时方案用decltype推导类型是可行的,但之前的写法会先默认构造hist再赋值,导致两次构造。改成成员初始化列表直接构造即可解决这个问题:
#include <boost/histogram.hpp> class HistContainer { public: using axis_t = boost::histogram::axis::regular<>; // 用decltype推导make_histogram的返回类型 using hist_t = decltype(boost::histogram::make_histogram(axis_t(10, 0, 10))); hist_t hist; // 直接在初始化列表构造,仅构造一次 HistContainer() : hist(boost::histogram::make_histogram(axis_t(10, 0, 10))) {} }; int main() { auto hist_container = HistContainer(); }
方案3:C++17+ 用auto成员变量简化声明
C++17及以上支持非静态成员变量用auto推导类型,直接在声明时初始化,无需手动指定复杂的模板参数,且仅构造一次对象:
#include <boost/histogram.hpp> class HistContainer { public: // 直接推导类型并初始化 auto hist = boost::histogram::make_histogram(boost::histogram::axis::regular<>(10, 0, 10)); // 若需要参数化初始化,可重载构造函数 HistContainer(int bins, double start, double end) : hist(boost::histogram::make_histogram(boost::histogram::axis::regular<>(bins, start, end))) {} }; int main() { auto hist_container = HistContainer(); auto hist_container2 = HistContainer(20, 0, 20); }
内容的提问来源于stack exchange,提问作者Joey
相关产品推荐
相关产品推荐

