如何在 C++ 中调用默认模板函数参数?

How to invoke default template functional argument in C++?

我想要我的模板函数

template<class function>
int probe(function call = [] (int a, int b) { return a+b; })
{
    return call(10, 10);
}

能够接收指向函数的指针并稍后调用该函数。这段摘录是正确的,编译器不会抱怨错误。让我们考虑这样的程序

#include <iostream>
#include <string>

template<class function>
int probe(function call = [] (int a, int b) { return a+b; })
{
    return call(10, 10);
}

int main()
{
    std::cout << probe([](int a,int b){ return a-b;});
}

程序输出了我所期望的:零。但是,我为这个调用明确指出了我正在传递的函数——我的意思是括号 [](int a,int b){ return a-b;} 中的这个 lambda 表达式。这很好,直到我什么也没传递——调用 std::cout << probe(); 是不正确的,但是我预计该函数将使用默认函数 function call = [] (int a, int b) { return a+b; }。那么,我该如何调用该函数的实例将在声明中使用默认 lambda 表达式的函数呢?

默认函数参数不参与模板参数推导。当没有显式给出函数参数时,编译器无法推断出 function,因此调用站点无法匹配到要调用的任何函数。

让您的示例正常工作的一个非常简单的方法是重载。

template<class function>
int probe(function call)
{
    return call(10, 10);
}

inline int probe() 
{ 
     return probe([] (int a, int b) { return a+b; }); 
}

另一种方法是为模板参数添加默认值。

显然必须是与 call 的默认值兼容的类型(decltype([] (int a, int b) { return a+b; }) 不起作用,因为每次定义 lambda 时都是不同的对象)。

template <typename function = std::function<int(int,int)>>
int probe (function call = [] (int a, int b) { return a+b; })
{
    return call(10, 10);
}

现在

probe();

有效,如果你记得#include <functional>

否则你可以在之前定义call的默认值,保存在常量中这样你就可以使用decltype()(而不需要#include <functional>

static const auto lam = [] (int a, int b) { return a+b; };

template <typename function = decltype(lam)>
int probe (function call = lam)
{
    return call(10, 10);
}