传递参数作为另一个函数的参数

时间:2017-03-16 12:16:10

标签: c++

我处于这种情况:

template<class  T>
void testFuncMulti (set<T> setInput,  bool (*f)() ) { 
  f();
}

 bool func()
{
    cout   << "Hello!" <<  endl;  
    return true;
}

int main() { 
    set<string> testSet; 
        testSet.insert("XXX");
     testFuncMulti(testSet,  &func); 
    return 0;
} 

我想要实现的是将参数传递给最后一个函数&#34; func&#34;。

以许多不同的方式尝试但仍然没有。

这是我的尝试:

template<class  T>
void testFuncMulti (set<T> setInput,  bool (*f)(T) ) { 
  f(T);
}

template<class  T>
 bool func(T val)
{
    cout   << "Hello!" <<  endl;  
    return true;
}

int main() { 
    set<string> testSet; 
        testSet.insert("XXX");
     testFuncMulti(testSet,  &func(string("YYY"))); 
    return 0;
} 

对不起,我是一个c ++新手......请帮忙!

更新:

解决!!

#include <iostream>
#include <functional>
#include <set>
 using namespace std;

template<class  T, class U>
void testFuncMulti (const set<T> setInput, U f) { 

     typename set<T>::iterator iter;
                for(iter = setInput.begin();iter != setInput.end();++iter) {
                        f(*iter); 
                }
}

template<class  T>
 bool func(const T val)
{   

    cout <<val  << "Hello!" <<  endl;  
    return true;
}

int main() { 
    set<string> testInput; 
        testInput.insert("XXX");
         testInput.insert("XXX222");
    testFuncMulti(testSet,   func<string> );  
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您要实现的目标称为功能绑定。此外,参数应以C ++方式编写 - std::function<bool()>。或者,正如@chris在评论中提到的那样,使用另一个参数和任何可调用的参数。

这可以通过两种方式实现。 STL一:

template<class  T, class U>
void testFuncMulti (set<T> setInput, U f) { 
  f();
}

template<class  T>
 bool func(T val)
{
    cout   << "Hello!" <<  endl;  
    return true;
}

int main() { 
    set<string> testSet; 
        testSet.insert("XXX");
     testFuncMulti(testSet,  std::bind(func<int>, string("YYY"))); 
    return 0;
} 

或使用lambda:

template<class  T, class U>
void testFuncMulti (set<T> setInput, U f) { 
  f();
}

template<class  T>
 bool func(T val)
{
    cout   << "Hello!" <<  endl;  
    return true;
}

int main() { 
    set<string> testSet; 
        testSet.insert("XXX");
     testFuncMulti(testSet, []() { return func("YYY"); }); 
    return 0;
} 

然而,它对你来说可能不是很有用 - 我想你也想把一些东西传递给这个函数。

在这种情况下,绑定可以是部分的。此外,您可能希望通过引用传递对象。

template<class  T, class U>
void testFuncMulti (const set<T>& setInput, U f) { 
  f(*setInput.begin());
}

template<class  T>
 bool func(const T& val, const T& second)
{
    cout   << "Hello!" <<  endl;  
    return true;
}

int main() { 
    set<string> testSet; 
        testSet.insert("XXX");
     testFuncMulti(testSet,  std::bind(func<int>, string("YYY"))); 
    return 0;
}

答案 1 :(得分:2)

当您将函数指针作为参数传递时,它与调用函数指针时的瞬间不同:

因此,需要将参数保存在某处并通过调用检索。可以通过引用(因此可以在其间更改值),也可以通过值(因此注册函数的时刻定义参数的值)。

在这两种情况下,似乎lambdas / functor是最合适的解决方案:

#include <iostream>
#include <functional>
#include <set>

template<class  T>
void testFuncMulti (std::set<T> setInput,  std::function<bool()> f ) { 
  f();
}

int main() { 
    std::set<std::string> testSet; 
        testSet.insert("XXX");
    int value = 42; // I like this number
    auto func = [&value]()->bool
    {
        std::cout << "Hello world! " << value << std::endl;
        return true;
    };
    testFuncMulti(testSet,  func); 
    return 0;
} 

已编辑:基于OP评论,没有lambdas或功能的解决方案(应兼容C ++ 98):

#include <iostream>
#include <set>

template<class  T, class U>
void testFuncMulti (std::set<T> setInput,  U f ) {
  f();
}

struct Functor
{
    int value;
    bool operator()()
    {
        std::cout << "Hello world! " << value << std::endl;
        return true;
    }
};

int main() {
    std::set<std::string> testSet;
        testSet.insert("XXX");

    Functor func;
    func.value = 42; // I like this number
    testFuncMulti(testSet,  func);
    return 0;
}