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

Passing parameter to function as argument of another function

本文关键字:函数 参数 另一个      更新时间:2023-10-16

我处于这种情况:

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

我想实现的是将参数传递到最后一个函数" func"。

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

这是我的尝试:

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

您要实现的目标称为函数绑定。另外,该参数应以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;
}

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

因此,需要将参数保存在某个地方并通过呼叫检索。通过参考(因此可以在之间更改值)或通过值(因此注册函数的矩定义参数的值)。

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

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