如何从模板类传递函数

how transfer function from template class

本文关键字:传递函数      更新时间:2023-10-16
#include <iostream>
#include <windows.h>
#include <string.h>
#include <functional>
#include <stdint.h>
#include <stdio.h>
using namespace std;
template <typename T>
class someclass {
public:
T value;
int sum(int vl1, int vl2) { return vl1 + vl2; };
};
template <typename T>
class someclass2 {
public:
T value; 
void print(const std::function<int(int, int)>& func) {
cout << func(3, 4) << 'n';
};
};
int main(int argc, const char **argv)
{
someclass<int> obj1;
someclass2<int> obj2;
obj2.print(obj1.sum); 
}

编译器在最后一行显示错误:错误 C3867:"someclass::sum":非标准语法;使用"&"创建指向成员的指针

注意

int sum(int vl1, int vl2) { return vl1 + vl2; };

不以任何方式使用其所有者类的成员,它可以安全地声明为静态的,在这种情况下,此代码将起作用。

此代码的问题在于成员函数的类型与独立函数不同。它是类someclass的成员,所以它的类型是int (someclass::*)(int, int)要调用它,你需要该类的实例。

一般情况下,文字解决方案是在 lambda 表达式创建的函子中隐藏this传递:

obj2.print( [&](int a, int b)-> int { return obj1.sum(a,b); } ); 

您可以使用std::bind来执行此操作

int main(int argc, const char **argv)
{
someclass<int> obj1;
someclass2<int> obj2;
using namespace std::placeholders;
obj2.print(std::bind(&someclass<int>::sum, &obj1, _1, _2));
}