我想'生成'一個函數指針的跳轉表。指向的功能有兩種類型的模板。對於兩個類型列表中的每個可能的對,應該有一個不同的函數實例化。理想情況下,我們可能會碰到這樣的:展開不同長度的參數包
#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