如何使用lambda作为模板参数,在C中使用默认值?

参见英文答案 > Can we use a lambda-expression as the default value for a function argument?1个
我想做一件简单的事:
void DoUntil(auto predicate = [] { return false; });

显然这不起作用 – 我必须使用模板参数:

template <typename P>
void DoUntil(P predicate = [] { return false; });

但是这个陈述也不起作用 – Clang给出了一个错误

error: no matching function for call to …
note: candidate template ignored: Couldn’t infer template argument ‘P’

如果我没有参数调用函数,编译器无法从认参数中推断出类型:

int main() { DoUntil(); }

我不想使用std :: function<>以任何方式.

我的问题还有其他可能的解决方案吗?

解决方法

使用函数重载而不是认参数功能.创建一个非模板函数,除模板函数外不带任何参数:
void DoUntil() ;

template <typename P>
void DoUntil(P predicate) ;

无参数版本可以简单地使用您要用作认谓词的lambda来调用模板版本:

void DoUntil() { DoUntil([] { return false; }); }

原始方法的问题在于,您尝试通过指定认参数值来提供认模板特化,但不指定认模板类型.即使不涉及lambdas,以下也不会起作用,因为T没有认类型,即使t具有认值:

template <typename T>
void Foo(T t = 3);

需要的是使用< typename T = int>指定T的认类型.

如WhiZTiM的回答所述,涉及lambda函数的案例的认类型必须使用decltype推导出来.这当然是因为lambdas具有只有编译器才知道的唯一类型.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...