Я хотел бы написать метафункцию C ++, которая, учитывая список типов без дублированных элементов, генерирует все возможные подсписки размером sizeof...(list) - 1
.
Обновление : я ищу общую реализацию метафункции find_all
, как определено ниже. Реализация, которую я сейчас имею, просто специализирует (жестко запрограммированный) результат для списков до 5 элементов, что, очевидно, не является универсальным.
Ниже приведены несколько простых определений и пример:
Имеется контейнер, в котором хранится список типов:
template<typename... Ts>
struct type_list{};
И «экземпляр» этого:
struct A{};
struct B{};
struct C{};
using ABC = type_list<A, B, C>::type;
И используя метафункцию, называемую find_all
:
using found_result = find_all<ABC>;
Результат должен быть:
using expected_result = type_list<
type_list<A, B>,
type_list<A, C>,
type_list<B, C>
>;
static_assert(
std::is_same<
expected_result,
found_result
>::value, "");
Допустимо, если элементы в результирующих подсписках или сами подсписки находятся в другом порядке, при условии, что порядок является детерминированным. Таким образом, следующий результат также действителен, например:
using another_possible_expected_result = type_list<
type_list<B, A>,
type_list<B, C>
type_list<C, A>,
>;
Я использую C ++ 11 (clang 6.0, Linux x86_64), но было бы хорошо, если бы C ++ 14.
Если это помогает, я также использую библиотеку метапрограммирования brigand
, которая имеет полезные функции для обработки списков / множеств, но я принимаю ответы, которые также используют другие библиотеки.