成员函数适配器与绑定器

写了个小函数温习一下,呵呵。

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
 
class Test
{
public:
     void print(int a)
     {
          cout << a << endl;
     }
};
int main()
{
     vector<int> v(10,10);
     Test t;
     for_each(v.begin(),v.end(),bind1st(mem_fun(&Test::print),&t) );
 
     vector<Test> v2(10);
     for_each(v2.begin(),v2.end(),bind2nd(mem_fun_ref(&Test::print),1) );
 
     mem_fun_ref(&Test::print)(t,6);
     mem_fun(&Test::print)(&t,8);
 
}
总之,对0元成员函数,mem_fun返回的函数对象(当作函数调用时)接受一个参数,即该类对象指针,
对1元成员函数,mem_fun返回的函数对象接受两个参数,第一个参数是该类对象指针,第二个参数是成员函数所接受参数。通过bind可以使其接受1个参数。
mem_fun_ref是针对对象的版本(而不是指针)

### C++ 中普通非成员函数实现动态绑定的可能性 在 C++ 中,动态绑定通常面向对象编程中的继承和多态机制紧密关联。具体来说,动态绑定主要通过虚函数表(vtable)来实现在运行时选择合适的函数版本执行[^3]。然而,对于普通的非成员函数而言,由于它们并不属于某个类的上下文范围,因此无法直接利用虚函数机制。 尽管如此,仍然可以通过间接方法模拟实现某种形式的“动态行为”。以下是几种可能的方式: #### 方法一:使用函数指针 函数指针是一种简单而有效的方式来存储并调用不同的函数。虽然这不是严格意义上的动态绑定,但它可以提供类似的灵活性。 ```cpp #include <iostream> void func1() { std::cout << "Function 1 called." << std::endl; } void func2() { std::cout << "Function 2 called." << std::endl; } int main() { void (*funcPtr)(); // 动态决定要调用哪个函数 bool condition = true; if (condition) { funcPtr = func1; } else { funcPtr = func2; } funcPtr(); // 根据条件调用了相应的函数 } ``` 这种方法的核心在于 `funcPtr` 的值是在程序运行期间设置的,从而实现了某种程度上的动态性[^1]。 #### 方法二:结合标准库功能 (`std::function` 和 `std::bind`) 如果希望更灵活地处理各种类型的回调函数,则可以借助 `<functional>` 头文件中的工具,如 `std::function` 和 `std::bind`。这种方式不仅适用于普通非成员函数,还能够很好地兼容其他类型的目标(例如 lambda 表达式、成员函数等)。下面是一个例子: ```cpp #include <iostream> #include <functional> // 定义两个简单的非成员函数 void greet(const std::string& name) { std::cout << "Hello, " << name << "!" << std::endl; } void farewell(const std::string& message) { std::cout << "Goodbye! Message: " << message << std::endl; } int main() { using namespace std::placeholders; // 创建一个通用目标容器 std::function<void(std::string)> action; // 基于某些逻辑切换实际的行为 bool isGreeting = false; if (isGreeting) { action = std::bind(greet, _1); } else { action = std::bind(farewell, _1); } action("World"); // 执行选定的操作 } ``` 此方案提供了更高的抽象层次,并且更加现代化[^2]。 #### 方法三:基于策略模式的设计思路 当需要频繁改变算法者操作流程的时候,设计模式中的 **Strategy Pattern** 可能会成为另一个值得考虑的选择。在这种情况下,即使最终的动作是由独立的自由函数完成的,也可以将其封装到适配器类内部以便更好地管理这些变化点。 --- ### 总结 综上所述,在纯技术层面确实不存在针对普通非成员函数的标准动态绑定概念;但是通过上述提到的技术手段——诸如运用函数指针、现代 STL 工具集以及合理架构规划等方式,完全可以达到相似的效果以满足大多数应用场景下的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值