C++ c++;将函子和参数传递给一个方法

C++ c++;将函子和参数传递给一个方法,c++,oop,interface,functor,C++,Oop,Interface,Functor,我要完成这个任务 函数DoJob()。 可以传递一些变量,如“message”来验证功能。 或者,可以不传递任何参数来验证函数 MySingleton::getInstance()->DoJob(verify1, "A message"); 现在,DoJob是单例类的函数。我可以在任何地方使用getInstance()来获取这个类。 基于此,如何定义DoJob和verify接口 谢谢,单身人士课程: struct MySingleton { static MySingleton*

我要完成这个任务

函数
DoJob()。
可以传递一些变量,如“
message
”来验证功能。 或者,可以不传递任何参数来验证函数

MySingleton::getInstance()->DoJob(verify1, "A message");
现在,
DoJob
是单例类的函数。我可以在任何地方使用
getInstance()
来获取这个类。 基于此,如何定义
DoJob
verify
接口

谢谢,

单身人士课程:

struct MySingleton
{
    static MySingleton* getInstance();

    // DoJob for verify functions that need a message.
    void DoJob(void (*verify)(std::string const&), std::string const& message)
    {
       verify(message);
    }

    // DoJob for verify functions that don't need a message.
    void DoJob(void (*verify)())
    {
       verify();
    }
};
用于验证的函数

void verify1(std::string const& message)
{
   // Do something with message
}
使用singleton和verify函数

MySingleton::getInstance()->DoJob(verify1, "A message");

您可以使用C++11可变模板来实现这一点

class Foo {
    //... 
public:
    static Foo & getInstance() {
        static Foo instance;
        return instance;
    }
    template <typename V, typename ...X>
    void DoJob (V verify, X... x) {
        verify(x...);
    } 
};

struct Vvoid {
    void operator () (void) {}
};

struct Vstring {
    void operator () (std::string) {}
};

void Vfunction (void) {}

//...
    Foo &f = Foo::getInstance();
    f.DoJob(Vvoid());
    f.DoJob(Vstring(), "msg");
    f.DoJob(Vfunction);
class-Foo{
//... 
公众:
静态Foo&getInstance(){
静态Foo实例;
返回实例;
}
模板
无效DoJob(V验证,X…X){
验证(x…);
} 
};
结构Vvoid{
void运算符()(void){}
};
结构Vstring{
void运算符()(std::string){}
};
void Vfunction(void){}
//...
Foo&f=Foo::getInstance();
f、 DoJob(Vvoid());
f、 DoJob(Vstring(),“msg”);
f、 DoJob(Vfunction);
请注意,
Vvoid
Vstring
是真正的functor(对象实例可以像使用
()
操作符的函数一样调用)。但是,模板语法允许传入任何可调用实例,包括常规函数指针(例如,
Vfunction


按照链接查看

我们能看到一些代码吗?如果我们看不到你在做什么,就很难提供建议。添加一个超载的
DoJob
@R Sahu我遇到了麻烦。当我使用getInstance()->DoJob(verify1,“xx”)时,我得到的“verify1”没有定义。我应该使用MySingleton::verify1而不是verify1吗?但上面说verify1的非静态memeber函数无效,但我不想让它成为静态的。我该怎么办?