参考模板中的模板化函数

时间:2016-03-14 10:46:17

标签: c++ c++11 template-templates

我希望能够在模板中命名为模板化函数。

因为可以使用"模板模板命名模板化的类"语法,因为可以使用"函数指针来命名函数"语法,我想知道是否有一个语法(或提议)来命名模板中的函数而不指定模板。

template<typename t_type>
struct A {
  t_type value;
};

template<template<typename> class t_type>
struct B {
  t_type<int> value;
};

template<int added>
constexpr int C (int value) {
  return value + added;
}

template<int (*function)(int)>
constexpr int D (int value) {
  return function(value);
}

// GOAL: Template argument referring to templated function
/*template<template<int> int (*function)(int)>
constexpr int E (int value) {
  return function<1>(value);
}*/

int main() {
  B<A> tt_good;
  int fp_good = D< &C<1> >(0);
  /*int fp_fail = E< &C >(0);*/

  return 0;
}

对于对此功能感兴趣的任何人可能首先使用名为(例如)&#34;方法&#34;的调用方法将函数D包装在结构中,将结构作为&#传递给E 34;模板模板&#34;参数,然后调用&#34;方法&#34;在E。

我不喜欢这种方法的原因是它需要一个包装结构来处理可能以这种方式使用的每个可变参数函数。

1 个答案:

答案 0 :(得分:0)

不幸的是,您无法将函数模板作为模板参数传递。最接近的是使用通用仿函数:

#include <iostream>

template <typename F>
void call(F f)
{
    f("hello, world\n");
}

int main()
{
    call([](auto value) { std::cout << value; });
}

如果你没有C ++ 14泛型lambda,你可以手工编写自己的仿函数:

#include <iostream>

template <typename F>
void call(F f)
{
    f("hello, world\n");
}

struct print
{
    template <typename T>
    void operator()(T value) const
    {
        std::cout << value;
    }
};

int main()
{
    call(print());
}