C ++函数接受函数指针和非静态成员函数作为参数

时间:2016-06-20 14:13:14

标签: c++ templates c++11

我构建了一个指向函数的接口。有时这个计算取决于状态,我希望将其封装在一个类中并传递其方法:

#include <iostream>


class Printer {
public:
    static void print(int i) {  // Want to get rid of the static
        std::cout << i << "\n";
    }
};


template<typename int_func>
void with_1(int_func func) {
    func(1);
}


int main(int argc, char const *argv[]) {
    Printer printer;
    with_1(printer.print);
    return 0;
}

我需要非静态方法(甚至更喜欢重载operator())。但是,删除静态会导致error: a pointer to a bound function may only be used to call the function

我可以使用这样的假人:

Printer printer;
void dummy(int i) {
    printer.print(i);
}


int main(int argc, char const *argv[]) {
    with_1(dummy);
    return 0;
}

但这对我来说并不优雅。我可以编写一个接受函数指针和非静态方法的模板吗?或者我的问题是否有更好的设计模式?

2 个答案:

答案 0 :(得分:1)

你不能简单地传递这样的非静态方法,因为它们适用于实例。一个简单的解决方案是使用lambda:

CKDatabaseSubscription

example

答案 1 :(得分:1)

试试这个:

int main(int argc, char const *argv[]) {
    Printer printer;
    with_1( std::bind( &Printer::print, printer, std::placeholders::_1 ) );
    return 0;
}

(您需要#include <functional>。)