如何在 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);
}
我想要我的模板函数
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);
}