传递参数作为另一个函数的参数函数
Passing parameter to function as argument of another function
我处于这种情况:
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;
}
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何定义在用作函数参数时工作的类模板的转换
- 将函数参数完美转发到函数指针:按值传递呢?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 接受模板作为函数参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- Arduino 函数参数