首页 > 解决方案 > 将函数模板原型作为参数传递

问题描述

我正在尝试将模板化函数传递给另一个,如下所示:

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

这里发生了什么?

标签: c++templatesgcccompiler-errorsclang

解决方案


以下所有标准参考资料均参考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,因此,您的程序格式不正确。


推荐阅读