【问题标题】:c++ pass functor and parameter to one Methodc ++将函子和参数传递给一个方法
【发布时间】:2014-10-14 03:08:21
【问题描述】:

我有这个要完成。

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

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

谢谢,

【问题讨论】:

  • 我们能看一些代码吗?如果我们看不到您的工作内容,我们很难提供建议。

标签: c++ oop interface functor


【解决方案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");

【讨论】:

  • 添加一个重载的DoJob
  • @R Sahu 我遇到了麻烦。当我使用 getInstance()->DoJob(verify1, "xx") 时,我得到 "verify1" 没有定义。我应该使用 MySingleton::verify1 而不是 verify1 吗?但它说使用verify1的非静态成员函数无效,但我不想让它成为静态的。我该怎么办?
【解决方案2】:

您可以使用 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.的链接

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 2013-02-08
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 2011-09-13
    相关资源
    最近更新 更多