【发布时间】:2017-06-23 22:36:39
【问题描述】:
使用 C++14 和 Curiously Recurring Template Pattern (CRTP) 和Boost.Hana(或boost::mpl,如果你愿意)的某种组合,我可以在编译时(或静态初始化时)构建类型列表吗? ) 没有明确的声明?
举个例子,我有这样的东西(见 Coliru):
#include <iostream>
#include <boost/hana/tuple.hpp>
#include <boost/hana/for_each.hpp>
namespace
{
struct D1 { static constexpr auto val = 10; };
struct D2 { static constexpr auto val = 20; };
struct D3 { static constexpr auto val = 30; };
}
int main()
{
// How to avoid explicitly defining this?
const auto list = boost::hana::tuple< D1, D2, D3 >{};
// Do something with list
boost::hana::for_each( list, []( auto t ) { std::cout << t.val << '\n'; } );
}
我想在创建list 时避免明确的类型列表——D1、D2 和D3,因为这意味着我必须在看起来像我的时候手动维护该列表应该能够在类声明中或周围告诉编译器,“将此类添加到您的运行列表中”。 (我的最终目标是自动化工厂注册,这是缺少的机制。)
我可以使用一些继承和/或元编程技巧在编译时或静态初始化时组成列表吗?
【问题讨论】:
-
b.atch.se 浮现在脑海中——但委员会正试图修补允许此类技巧的漏洞,因此您可能不应该使用它。
标签: c++ c++14 template-meta-programming crtp boost-hana