C++ Can';";“存储成员函数”;模板中
我想“在我的类中存储成员函数”,以便以后在某些情况下调用它。但我无法修复用于存储带有参数的成员函数的代码。这是我的密码:C++ Can';";“存储成员函数”;模板中,c++,templates,C++,Templates,我想“在我的类中存储成员函数”,以便以后在某些情况下调用它。但我无法修复用于存储带有参数的成员函数的代码。这是我的密码: class IMemFn { public: IMemFn() {} IMemFn(const IMemFn& other) = delete; IMemFn& operator=(const IMemFn& other) = delete; IMemFn(IMemFn&& other) = delete
class IMemFn
{
public:
IMemFn() {}
IMemFn(const IMemFn& other) = delete;
IMemFn& operator=(const IMemFn& other) = delete;
IMemFn(IMemFn&& other) = delete;
IMemFn& operator=(IMemFn&& other) = delete;
virtual ~IMemFn() {}
virtual void func(const std::string& name, const std::string& value) = 0;
};
template<typename ReturnType, class Class>
class MemFn final : public IMemFn
{
public:
typedef ReturnType(Class::*Method)();
MemFn(Class* object, Method method) : IMemFn(), m_object(object), m_method(method) {};
virtual void func(const std::string& name, const std::string& value) override final
{
(m_object->*m_method)(name, value);
};
private:
Class* m_object;
Method m_method;
};
class Test
{
public:
template <class Class, typename Method>
void addMemFn(Class* obj, Method method) {
auto memFn = new MemFn<typename std::result_of<decltype(method)(Class)>::type, Class>(std::forward<Class*>(obj), std::forward<Method>(method));
m_memFns.push_back(memFn);
}
private:
std::list<IMemFn*> m_memFns;
};
class SomeClass
{
public:
void funcAll(const std::string& name, const std::string& value) { std::cout << "SomeClass func"; }
};
class SomeClass2
{
public:
void func2(const std::string& name, const std::string& value) { std::cout << "SomeClass2 func"; }
};
int main()
{
Test test;
SomeClass someClass;
SomeClass2 someClass2;
test.addMemFn(&someClass, &SomeClass ::funcAll);
test.addMemFn(&someClass2, &SomeClass2::func2);
return 0;
}
类IMemFn
{
公众:
IMemFn(){}
IMemFn(常量IMemFn和其他)=删除;
IMemFn和运算符=(常量IMemFn和其他)=删除;
IMemFn(IMemFn&&other)=删除;
IMemFn和运算符=(IMemFn和其他)=删除;
虚拟~IMemFn(){}
虚空函数(常量std::string和name,常量std::string和value)=0;
};
模板
类MemFn最终版本:公共IMemFn
{
公众:
typedef ReturnType(类::*方法)();
MemFn(类*对象,方法):IMemFn(),m_对象(对象),m_方法(方法){};
虚拟void func(常量std::string&name,常量std::string&value)覆盖final
{
(m_对象->*m_方法)(名称、值);
};
私人:
类*m_对象;
方法m_法;
};
课堂测试
{
公众:
模板
void addMemFn(类*obj,方法){
auto memFn=新memFn(标准::转发(obj),标准::转发(方法));
m_memFns.向后推(memFn);
}
私人:
std::列出m_memFns;
};
上课
{
公众:
void funcAll(const std::string&name,const std::string&value){std::cout此处需要进行一些更改以使其编译:
- 首先
std::result\u of谢谢大家的回答!看来我很累了,因为这些该死的填塞。我用std::functions和std::bind一起使用,现在一切都简单明了。所以,我的最终代码是:
class Test
{
public:
template <class Class, typename Method>
void addMemFn(Class* obj, Method method) {
auto func = std::bind(method, obj, std::placeholders::_1, std::placeholders::_2);
m_funcs.push_back(func);
}
private:
std::list<std::function<void(const std::string&, const std::string&)>> m_funcs;
};
class SomeClass
{
public:
void funcAll(const std::string& name, const std::string& value) { std::cout << "SomeClass func"; }
};
class SomeClass2
{
public:
void func2(const std::string& name, const std::string& value) { std::cout << "SomeClass2 func"; }
};
int main()
{
Test test;
SomeClass someClass;
SomeClass2 someClass2;
test.addMemFn(&someClass, &SomeClass::funcAll);
test.addMemFn(&someClass2, &SomeClass2::func2);
return 0;
}
类测试
{
公众:
模板
void addMemFn(类*obj,方法){
auto func=std::bind(方法、对象、std::占位符::u1、std::占位符::u2);
m_func.向后推(func);
}
私人:
std::list m_funcs;
};
上课
{
公众:
void funcAll(const std::string&name,const std::string&value){std::cout您是否试图避免std::mem_fn
?为什么不使用a?还可以查看std::bind
和lambda函数。查看std::function
的实现以获得灵感。std::result\u of返回类型(类:*Method)();
这也是错误的,因为该方法采用了两个类型为std::string&
的参数,因此()
不表示其参数列表。您可以通过删除std::bind
而使用lambda来进一步改进