Код: Выделить всё
template
class Foo {
public:
Foo(const Args&... args) :gr1{/*...*/}, gr2{/*...*/} {}
private:
template_one gr1;
template_two gr2;
};
сортировщик типов, который возвращает пару кортежей, содержащих отсортированные типы.
Код: Выделить всё
template
struct type_sorter;
template
struct type_sorter {
constexpr static auto sort() {return std::pair{}; }
};
template
struct type_sorter {
constexpr static auto sort() {
auto ret = type_sorter::sort();
if constexpr (std::is_function_v)
return std::make_pair(std::tuple_cat(ret.first, std::tuple{}), ret.second);
else
return std::make_pair(ret.first, std::tuple_cat(ret.second, std::tuple{}));
}
};
Код: Выделить всё
template
constexpr auto param_sort(Arg&& arg) {
if constexpr (std::is_function_v)
return std::make_pair(std::tuple(arg), std::tuple());
else
return std::make_pair(std::tuple(), std::tuple(arg));
}
template
constexpr auto param_sort(Arg&& arg, Args&&... args) {
auto ret = param_sort(std::forward(args)...);
if constexpr (std::is_function_v)
return std::make_pair(std::tuple_cat(ret.first, std::tuple(arg)), ret.second);
else
return std::make_pair(ret.first, std::tuple_cat(ret.second, std::tuple(arg)));
}
Первый можно использовать для сортировки типов без необходимости предоставления аргументов, а второй сортирует как параметры шаблона, так и аргументы. Это полезно при наличии доступа только к пакету параметров шаблона. (В области класса.)
Теперь они оба возвращают кортежи:
Я хотел бы иметь возможность извлекать пакеты параметров (Group1, Group2) из кортежей, сгенерированных сортировщиком типов, и использовать его в объявлении template_one и template_two.
Я попробовал:
Код: Выделить всё
template_one>(type_sorter::sort().second)...)
> gr1 {};
Возможно ли такое вообще?
Подробнее здесь: https://stackoverflow.com/questions/787 ... -pack-in-a