使用函数指针将字符串数组作为参数传递

时间:2018-11-21 16:30:59

标签: c++ c++11 parameter-passing function-pointers

我正在尝试将一个函数指针传递给另一个 function ,该函数具有一个字符串数组作为参数。到目前为止,我有以下内容:

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 :(得分:1)

正确的语法是:

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);
}

答案 1 :(得分:1)

  

如果可能的话,宁愿清洁工这样做。

从这里

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

您似乎想在绑定参数(字符串数组之后,将可调用对象(pass_function)传递给另一个函数(takes_a_function)。 em>)。如果是这样,您可以在C ++中有更好的选择。

首先使用std::vector<std::string>std::array<std::string, 2>(如果知道大小,则使用 )来存储字符串。其次,通过以下两种方式之一将callable传递给另一个函数:

  1. 使用lambdastd::bind

    takes_a_function用作模板函数,然后 与参数绑定传递可调用对象(pass_function 作为Lambda函数)。

    #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;
    }