c++ - 将函数模板原型作为参数传递
问题描述
我正在尝试将模板化函数传递给另一个,如下所示:
template<typename T = bool>
void fun() {}
template<typename F>
void higher_order_fun( const F & f) {
f();
}
int main () {
//higher_order_fun(fun<>); //works
higher_order_fun(fun);
}
在gcc10.2
我能够以fun
与指定类型相同的方式传递(模板原型)fun<>
。
请注意,如果我没有默认模板参数 T=bool,这将不起作用。
在Clang11
这不起作用。
请参阅https://godbolt.org/z/9WfMdc。
这里发生了什么?
解决方案
以下所有标准参考资料均参考N4659:2017 年 3 月 Kona 后工作草案/C++17 DIS。
这可以说是一个 GCC 错误(/extension 功能),尽管我无法找到它的票证。
根据[temp.names]/1 ,您可以通过template-id来引用模板特化。后者的语法不允许省略尖括号,即使其中的模板参数列表可能为空(opt):<>
模板特化可以由template-id引用:
simple-template-id: template-name < template-argument-list_opt > template-id: simple-template-id operator-function-id < template-argument-list_opt > literal-operator-id < template-argument-list_opt >
在您的情况下,您想引用fun<bool>
函数模板的特化,fun
这与您可以通过使用单一类型模板参数的默认模板参数来引用的特化相同fun
,即 as fun<>
。但是,您不能fun<bool>
仅通过指定fun
;来引用专业化。后者不是指specialization,因此,您的程序格式不正确。
推荐阅读
- bash - 如果 bash 命令成功或失败,如何让整个 bash 脚本退出(包括后台进程)?
- generics - 有没有办法将字符串转换为带有字段的枚举(命名结构枚举)?
- python - 跳过的 Elif 语句
- javascript - 尝试将 JSON 字符串作为有效负载传递后,AWS Lambda 中出现意外的令牌错误
- mongodb - Mongoexport 返回比指定限制更多的记录
- angular - MatSnackBar open 不会从styles.css 中选择样式
- html - 在网络爬虫中选择多个选项
- amazon-web-services - 从 AWS Lambda 函数发送电子邮件
- excel - 如何使用索引和匹配来引用单独的工作表?
- javascript - 有没有办法以某种方式同时拥有绝对位置(底部)和多个相同 div 并排?