Передать массив строк в качестве аргумента с указателем на функцию - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь передать указатель на функцию другой функции , которая имеет строковый массив в качестве аргументов.до сих пор у меня есть следующее:

void pass_function(string args[]) {    
    //so something with args.
}

void takes_a_function(void(*function)(string[])) {
    function;
}

int main()
{
    string s[] = { "hello", "World" };
    takes_a_function(pass_function(s));

    system("pause");    
    return 0;
}

проблема заключается в том, что параметр pass_function(s) приведен как void, а не void(*function)(sting *)

Я воображаюэто требует броска, но предпочел бы, чтобы уборщик делал это, если это возможно.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

предпочел бы, чтобы уборщик делал это, если это возможно.

Отсюда

takes_a_function(pass_function(s));
                 ^^^^^^^^^^^^^^^^^^

похоже, что вы хотите передать что-то вызываемое (pass_function) к другой функции (takes_a_function), после привязка аргумент ( строковый массив ).Если это так, у вас есть лучшие варианты в C ++.

Сначала используйте std::vector<std::string> или std::array<std::string, 2> (, если известен размер ) для хранения строк.Во-вторых, передача вызываемой функции в другую функцию одним из следующих способов:

  1. Использование лямбда и std :: bind

    Сделать takes_a_function функцией шаблона и затем после привязки с аргументом передать вызываемый объект (pass_function как лямбда-функцию) ему.

    #include <vector>     // std::vector
    #include <functional> // std::bind
    
    template<typename Callable> 
    void takes_a_function(const Callable &function) 
    {
        function(); // direckt call
    }
    
    int main()
    {
        std::vector<std::string> s{ "hello", "World" };
        auto pass_function = [](const std::vector<std::string> &args) { /*do something*/ };
    
        takes_a_function(std::bind(pass_function, s));        
        return 0;
    }
    
  2. Использование указателя функции

    Если указатель функции неизбежен, вам нужно два аргумента в takes_a_function, один должен быть указателем функции, а другой -массив строк.

    #include <vector>     // std::vector
    
    // convenience type
    using fPtrType = void(*)(std::vector<std::string> const&);
    
    void pass_function(const std::vector<std::string> &args) { /*do something*/ };
    
    void takes_a_function(const fPtrType &function, const std::vector<std::string> &args)
    {
        function(args); // call with args
    }
    
    int main()
    {
        std::vector<std::string> s{ "hello", "World" };
        takes_a_function(pass_function, s);
        return 0;
    }
    
0 голосов
/ 21 ноября 2018

Правильный синтаксис:

takes_a_function(pass_function);

В качестве альтернативы:

void pass_function(std::string args[]);

void takes_a_function(void(*function)(std::string[]), std::string args[]) {
    function(args);
}

int main() {
    std::string s[] = { "hello", "World" };
    takes_a_function(pass_function, s);
}
...