2015-12-21 6 views
0

У меня есть статическая функция Bar::Function(std::string s1, std::string s2, std::string s3), которую я хочу передать в качестве функции для указателя на конструктор класса Foo, который имеет член boost::function.Как передать указатель функции, когда аргументы еще не известны

Но три строки создаются в классе Foo() и еще не известны, когда функция передается как функция для указателя на конструктор Foo. Должен ли я просто передать три пустые строки, поскольку я делаю это в main()?

class Foo(boost::function<int(std::string, std::string, std::string)> fFunction) 
{ 
public: 
    Foo() 
    { 
     fnCallback = fFunction; 
    } 

    int Call() 
    { 
     return fnCallback("first", "second", "third") 
    } 
protected: 
    boost::function<int(std::string, std::string, std::string)> fnCallback; 
}; 


int main(int /*nArgc*/, char */*paszArgv*/[]) 
{ 
    boost::function<int(std::string, std::string, std::string)> fn = boost::bind(Bar::Function, "", "", ""); 
    Foo oFoo(fn); 
    oFoo.Call(); 
    return 0; 
} 

class Bar 
{ 
public: 
    static int Function(std::string s1, std::string s2, std::string s3) 
    { 
     std::cout << s1 << s2 << s3 << std::endl; 
    } 
}; 

EDIT: Так выглядит код. Указатель функции содержит только адрес функции. Аргументы передаются при его вызове!

fn = &Bar::Function; 
+0

Когда вы передаете указатель на функцию, он не принимает аргументов. – YSC

+0

Взгляните на заполнители http://stackoverflow.com/questions/18680607/role-of-placeholder-in-boostbind-in-the-following-example – dkg

+0

Я разместил образец кода. Кстати, есть много ошибок грамматики ... – yasuharu519

ответ

1

Я думаю, вам нужно использовать std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, вместо пустых строк. Если меня, я хотел бы сделать, как следующее,

https://gist.github.com/yasuharu519/213307b4709662e60df2

#include <functional> 
#include <iostream> 
#include <string> 

class Foo 
{ 
public: 
    Foo(std::function<int(std::string, std::string, std::string)> fFunction) : fnCallback{fFunction} {} 
    int Call() { return fnCallback("first", "second", "third"); } 

protected: 
    std::function<int(std::string, std::string, std::string)> fnCallback; 
}; 

class Bar 
{ 
public: 
    static int Function(std::string s1, std::string s2, std::string s3) 
    { 
    std::cout << s1 << s2 << s3 << std::endl; 
    return 0; 
    } 
}; 

int main(int /*nArgc*/, char* /*paszArgv*/ []) 
{ 
    using namespace std::placeholders; 
    auto fn = std::bind(Bar::Function, _1, _2, _3); 
    Foo oFoo(fn); 
    oFoo.Call(); 
    return 0; 
} 
+0

'Bar :: Function' - статическая функция. Нет необходимости в заполнителях: 'Foo oFoo (Bar :: Function)'. – YSC

+0

Я не проголосовавший; это технически правильно. Это, однако, излишнее. В этом случае нет необходимости использовать 'std :: bind' или заполнители. –

+0

Хотя верно в конкретном случае, показанном здесь, вполне вероятно, что ОП упростил свой код, чтобы задать вопрос (это хорошо!), Но невольно упростил его настолько, что их чистый ответ был изменен. Таким образом, заполнители могут быть * точно *, что им нужно! –

2

Вот минимальный пример:

#include <iostream> 
#include <string> 

struct Foo 
{ 
    typedef int (*callback_type)(std::string, std::string, std::string); 

    Foo(callback_type callback) 
     : _callback(callback) 
    {} 

    int operator()() 
    { 
     return _callback("1", "2", "3"); 
    } 

private: 
    callback_type _callback; 
}; 

struct Bar 
{ 
    static int Function(std::string s1, std::string s2, std::string s3) 
    { 
     std::cout << s1 << s2 << s3 << std::endl; 
     return 0; 
    } 
}; 

int main() 
{ 
    Foo foo(Bar::Function); 
    foo(); 
    return 0; 
} 

123\n печать.

Смежные вопросы