Я хотел бы «сгенерировать» таблицу переходов указателей функций. Функции, на которые указываются, являются шаблонами с двумя типами. Для каждой возможной пары в двух списках типов должна существовать другая функция. В идеале, мы могли бы иметь что-то вроде:Развернуть пакеты параметров различной длины
#include <tuple>
template <typename X, typename Y>
void foo()
{}
template <typename... Xs, typename... Ys>
void bar(const std::tuple<Xs...>&, const std::tuple<Ys...>&)
{
using fun_ptr_type = void (*) (void);
static constexpr fun_ptr_type jump_table[sizeof...(Xs) * sizeof...(Ys)]
= {&foo<Xs, Ys>...};
}
int main()
{
using tuple0 = std::tuple<int, char, double>;
using tuple1 = std::tuple<float, unsigned long>;
bar(tuple0{}, tuple1{});
}
Как и ожидалось, он терпит неудачу, когда кортежи имеют разную длину:
foo.cc:15:20: error: pack expansion contains parameter packs 'Xs' and 'Ys' that have different lengths (3 vs. 2)
= {&foo<Xs, Ys>...};
~~ ~~^
foo.cc:23:3: note: in instantiation of function template specialization 'bar<int, char, double, float, unsigned long>' requested here
bar(tuple0{}, tuple1{});
^
1 error generated.
Для достижения такого рода функциональности, я уже пробовал и успешно с indirection (а первая таблица перехода, содержащая указатели на функции с другой таблицей перехода), но я нахожу ее неуклюжей.
Итак, мой вопрос: есть ли обходной путь к этому?
Спасибо, это очень просто, а часть манипулирования списком легко использовать повторно. –
Элемент списка можно сделать немного более гладким с помощью шаблона struct L {using type = L;}; 'и наследования, а также несколько шаблонов с использованием cat_t = typename cat :: type;' aliases. [См. Здесь] (http://ideone.com/hI4Ohu). –
Yakk