下面的小程序,编译和运行,允许使用一组模板函数桥接类型为index
的运行时变量unsigned
,模板函数具有J
类型unsigned
1}}。
如果需要进一步澄清,可以在this question中更好地解释。
我编写的辅助函数使用模板模板参数,从原始函数中推断出尽可能多的信息。问题是除了创建2个包装FunWrap
和wrap_foo
之外,我找不到更好的方法来定义模板模板参数wrap_zoo
,而我本来希望用作模板模板直接参数foo
和zoo
。有没有办法做到这一点?
#include <iostream>
#include <utility>
#include <array>
using namespace std;
// boiler plate stuff
template <template <unsigned J> typename FunWrap, unsigned... Is>
decltype(auto) get_fun_ptr_aux(std::integer_sequence<unsigned, Is...>, unsigned i)
{
typedef decltype(&FunWrap<1>::run) FunPtr;
constexpr static std::array<FunPtr, sizeof...(Is)> fun_ptrs = { &FunWrap<Is>::run... };
return fun_ptrs[i];
}
template <template <unsigned J> typename FunWrap, unsigned N>
decltype(auto) get_fun_ptr(unsigned i)
{
return get_fun_ptr_aux<FunWrap>(std::make_integer_sequence<unsigned, N>{}, i);
}
// template functions to be bridged with runtime arguments
// two functions with same template arguments but different signature
template <unsigned J>
void foo() { cout << J << "\n"; }
template <unsigned J>
double zoo(double x) { return x + J; }
// 1 wrapper per each function
template <unsigned J>
struct wrap_foo {
static void *run() { foo<J>(); } // same signature as foo
};
template <unsigned J>
struct wrap_zoo {
static double run(double x) { return zoo<J>(x); } // same signature as zoo
};
int main()
{
unsigned index = 5;
(*get_fun_ptr<wrap_foo,10>(index))();
cout << (*get_fun_ptr<wrap_zoo,10>(index))(3.5) << "\n";
return 0;
}
答案 0 :(得分:0)
我希望直接将
foo
和zoo
用作模板模板参数。有没有办法做到这一点?
由于foo
和zoo
是模板功能,我担心答案是否定的。 C ++在处理重载集/模板时非常糟糕。示例:Disambiguate overloaded member function pointer being passed as template parameter