【问题标题】:Templated function pointer with arguments as template parameter带有参数的模板函数指针作为模板参数
【发布时间】:2018-01-02 23:29:00
【问题描述】:

我无法编译我的代码。我希望能够声明一个将另一个函数(或定义了 operator() 的类或 lambda 表达式)作为参数的函数,并且该函数也具有模板参数。这是我想做的一个例子:

template <class T, T F> 
T execF(T a, T b) 
{ 
    return F(a, b); 
}

template <class T>
T add(T a, T b) 
{ 
    return a + b;
}

int main()
{ 
    std::cout << execF<int, add>(3,4) << std::endl;
}

在 C++14 中可以做这样的事情吗?

【问题讨论】:

  • 您希望将函数作为模板参数而不是普通函数参数传递的原因是什么?因为有了函数参数,它在任何版本的 C++ 中都非常容易(并且也反映了 C++ 标准库如何处理可调用参数)。
  • template&lt;class T, T F&gt; 更改为template&lt;class T, T(&amp;F)(T,T)&gt;

标签: c++ templates


【解决方案1】:

应该是:

template <class T, T F(T, T)>
T execF(T a, T b)
{
    return F(a, b);
}

如果你想省略所有模板参数,我建议坚持 Some Programmer Dude 的评论并接受函数作为函数参数:

template <typename T>
T execF(T a, T b, T f(T, T))
{
    return f(a, b);
}

template <typename T>
T add(T a, T b) { return a + b; }

int main(int , char **)
{
    auto x = execF(41.8f, 0.2f, add); //all params deduced in both functions
    std::cout << x << std::endl;

    x = execF(27, 15, add); //idem
    std::cout << x << std::endl;

    return 0;
}

【讨论】:

  • 这行得通,但是有没有办法像这样调用它: execF(3,4) 而不必指定模板的第一个参数?
  • 我不这么认为(至少在 c++14 之前)。无论如何,我编辑了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 2015-01-20
  • 2021-12-10
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多