将函数模板原型作为参数传递
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 bool
和 fun
或 fun<>
,但您不能删除默认模板参数或它将无法推断。
以下所有标准参考均参考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,因此,您的程序格式错误。
我正在尝试将模板化函数传递给另一个函数,如下所示:
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 bool
和 fun
或 fun<>
,但您不能删除默认模板参数或它将无法推断。
以下所有标准参考均参考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,因此,您的程序格式错误。