使用依赖于非类型模板参数的泛型函数的签名作为模板模板参数

时间:2017-12-15 15:43:14

标签: templates c++14 template-templates

下面的小程序,编译和运行,允许使用一组模板函数桥接类型为index的运行时变量unsigned,模板函数具有J类型unsigned 1}}。

如果需要进一步澄清,可以在this question中更好地解释。

我编写的辅助函数使用模板模板参数,从原始函数中推断出尽可能多的信息。问题是除了创建2个包装FunWrapwrap_foo之外,我找不到更好的方法来定义模板模板参数wrap_zoo,而我本来希望用作模板模板直接参数foozoo。有没有办法做到这一点?

#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;
}

1 个答案:

答案 0 :(得分:0)

  

我希望直接将foozoo用作模板模板参数。有没有办法做到这一点?

由于foozoo是模板功能,我担心答案是否定的。 C ++在处理重载集/模板时非常糟糕。示例:Disambiguate overloaded member function pointer being passed as template parameter