Использование C++ 14 и некоторая комбинация Curiously Recurring Template Pattern (CRTP) и, возможно, Boost.Hana (или boost::mpl
, если хотите), могу ли я построить список типов во время компиляции (или статическое время инициализации) без явного объявления?C++ 14 Метапрограммирование: автоматически создавать список типов во время компиляции/инициализации
В качестве примера, у меня есть что-то вроде этого (см это на 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
, потому что это означает, что я должен поддерживать этот список вручную, когда мне кажется, что я должен сказать компилятору в объявлении класса или вокруг него: «Добавьте этот класс в свой список». (Моя конечная цель - автоматизировать регистрацию на заводе, и это недостающий механизм.)
Могу ли я сделать это с помощью какого-либо наследования и/или метапрограммирования для составления списка во время компиляции или статического времени инициализации?
http://b.atch.se/ приходит на ум, - но Комитет пытается исправить лазейку, которая позволяет такие трюки, поэтому вы, вероятно, не должны этого использовать. – Quentin