gpt4 book ai didi

c++ - 使用 boost 传递函数指针参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:27:15 25 4
gpt4 key购买 nike

可以使用 boost::function 和/或 boost::bind 简化/改进以下函数指针传递吗?

void PassPtr(int (*pt2Func)(float, std::string, std::string))
{
int result = (*pt2Func)(12, "a", "b"); // call using function pointer
cout << result << endl;
}

// execute example code
void Pass_A_Function_Pointer()
{
PassPtr(&DoIt);
}

最佳答案

您可以使用 boost::function<>使使用不同类型的可调用对象作为函数的输入成为可能。

以下是使用 C++11 的示例(请参阅此示例后的备注)。这就是您重写函数的方式:

#include <functional>
#include <string>
#include <iostream>

void PassFxn(std::function<int(float, std::string, std::string)> func)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
int result = func(12, "a", "b"); // call using function object
std::cout << result << std::endl;
}

这些是用来测试它的几个函数:

int DoIt(float f, std::string s1, std::string s2)
{
std::cout << f << ", " << s1 << ", " << s2 << std::endl;
return 0;
}

int DoItWithFourArgs(float f, std::string s1, std::string s2, bool b)
{
std::cout << f << ", " << s1 << ", " << s2 << ", " << b << std::endl;
return 0;
}

struct X
{
int MemberDoIt(float f, std::string s1, std::string s2)
{
std::cout << "Member: " << f << ", " << s1 << ", " << s2 << std::endl;
return 0;
}

static int StaticMemberDoIt(float f, std::string s1, std::string s2)
{
std::cout << "Static: " << f << ", " << s1 << ", " << s2 << std::endl;
return 0;
}
};

这是测试例程:

int main()
{
PassFxn(DoIt); // Pass a function pointer...

// But we're not limited to function pointers with std::function<>...

auto lambda = [] (float, std::string, std::string) -> int
{
std::cout << "Hiho!" << std::endl;
return 42;
};

PassFxn(lambda); // Pass a lambda...

using namespace std::placeholders;
PassFxn(std::bind(DoItWithFourArgs, _1, _2, _3, true)); // Pass bound fxn

X x;
PassFxn(std::bind(&X::MemberDoIt, x, _1, _2, _3)); // Use a member function!

// Or, if you have a *static* member function...
PassFxn(&X::StaticMemberDoIt);

// ...and you can basically pass any callable object!
}

这是一个 live example .

备注:

您可以轻松更改 std::function<>进入boost::function<>std::bind<>进入boost::bind<>如果您使用的是 C++03(事实上,Boost.Function 启发了 std::function<>,后来成为标准 C++ 库的一部分)。在这种情况下,而不是包括 <functional> header ,您必须包含 boost/function.hppboost/bind.hpp header (后者仅在您想使用 boost::bind 时使用)。

再举一个例子,让您感受到 std::function<> 的力量/boost::function<>通过它封装任何类型的可调用对象的能力,另请参阅 this Q&A on StackOverflow .

关于c++ - 使用 boost 传递函数指针参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15323299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com