如何解决将模板化函子作为参数传递给 C++ 中的模板化函数
我正在尝试将模板化函子传递给模板化函数。 代码如下所示:
template<typename T>
T func_1(T &a) {
return a;
}
template <typename T>
T test(T &a,std::function<T(T&)> &func){
return func(a);
}
int main(){
int a = 5;
std::cout << test(a,func_1) << std::endl;
}
但是,我收到以下编译错误:
类型为‘’的右值对‘std::function
如果我删除模板,代码就可以工作。有人能帮我理解为什么吗?
解决方法
func_1
是函数模板。您必须传递要实例化此函数的具体类型。在您的情况下,它是 int
,a
变量的类型。
std::cout << test(a,func_1<decltype(a)>) << std::endl;
然后,可以使用 function
实例化创建 func_1<int>
对象。这个函数是临时的,但是临时的不能绑定到Lvalue引用,所以test
的签名应该修改为接受const Lvalue引用:
template <typename T>
T test(T &a,const std::function<T(T&)> &func){
// <---- const
return func(a);
}
,
问题在于 func_1
只是一个模板,要获得函数指针,您首先需要一个函数(即函数模板的实例化)。
您可以通过使 func_1
成为不是模板本身的实际函子(即可调用对象)来获得您想要的:
#include <functional>
#include <iostream>
struct func_1 {
template <typename T>
T operator()(T& a){ return a; }
};
template <typename T,typename F>
T test(T &a,F func){
return func(a);
}
int main(){
int a = 5;
std::cout << test(a,func_1{}) << std::endl;
// ^^ create instance
}
“技巧”是只有 func_1::operator()
是模板,因此您可以创建 func_1
的对象并在您知道 T
实际是什么之前传递它们。运算符仅在 test
中被调用时被实例化,而在 main
中不会被实例化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。