我想'生成'一个函数指针的跳转表。指向的功能有两种类型的模板。对于两个类型列表中的每个可能的对,应该有一个不同的函数实例化。理想情况下,我们可能会碰到这样的:展开不同长度的参数包
#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成功(一第一个跳转表,其中包含指向另一个跳转表的函数的指针),但我觉得它很笨拙。
所以,我的问题是:有没有解决方法呢?
谢谢,它非常简单,列表操作部分很容易重用。 – 2014-09-04 16:35:30
使用'template struct L {using type = L;};'和''继承,以及使用cat_t = typename cat :: type;'aliases'的一些'template 可以使列表内容变得更加流畅。 [见这里](http://ideone.com/hI4Ohu)。 –
Yakk
2014-09-04 19:13:09