将函数模板原型作为参数传递

passing function template prototype as argument

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

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

这是怎么回事?

您需要在传递 fun 时指定什么是 T,因为您需要实例化该参数来构建该函数。编译器需要以某种方式推断 T

编译器假定 T 是 class boolfunfun<>,但您不能删除默认模板参数或它将无法推断。

以下所有标准参考均参考N4659: March 2017 post-Kona working draft/C++17 DIS


这可以说是一个 GCC 错误(/扩展功能),尽管我还没有找到它的票证。

根据 [temp.names]/1,您可以通过 template-id 引用 template specialization。后者的语法不允许省略尖括号 <>,即使其中的 template-argument-list 可能为空(opt ):

A template specialization can be referred to by a 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的特化fun<bool>,这与你可以参考的特化相同通过为 fun 的单一类型模板参数使用默认模板参数,即 fun<>。但是,您不能仅通过指定 fun 来引用 fun<bool> 专业化;后者不涉及 specialization,因此,您的程序格式错误。