c ++将仿函数和参数传递给一个Method

时间:2014-08-20 16:42:24

标签: c++ oop interface functor

我有这个要做。

功能DoJob()会采用不同的" verify"仿函数以不同的方式验证事物。 可以传递一些变量,例如" message"验证功能。 或者,它可能不传递任何参数来验证功能。

现在,DoJob是单例类的函数。我可以在任何地方使用getInstance()来获得此课程。 基于此,如何定义DoJobverify接口?

谢谢,

2 个答案:

答案 0 :(得分:1)

单身人士课程:

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
}

使用单例和验证功能。

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

答案 1 :(得分:0)

您可以使用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);

请注意,VvoidVstring是真正的仿函数(可以像()运算符一样调用的对象实例)。但是,模板语法允许传入任何可调用的实例,包括常规函数指针(例如,Vfunction)。

点击working demo.

的链接