使用 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'; } );
}
我想在创建时避免显式类型列表 -- D1
、D2
和D3
--list
因为这意味着当我似乎应该能够在类声明中或周围告诉编译器时,我必须手动维护该列表,"将此课程添加到您的跑步列表中”。(我的最终目标是自动化工厂注册,这是缺少的机制。)
我可以使用一些继承和/或元编程技巧在编译时或静态初始化时组成列表吗?