From:http://www.cppblog.com/tim/archive/2007/10/15/34250.html
看过了funciton object中的部分内容,感觉这些技术、概念等真的需要慢慢体会,才能感受到它的博大精深。
看下面的这个例子:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void printInt (int elem)
{
cout << elem << ' ' ;
}
int main()
{
vector<int> coll;
//insert elements from 1 to 9
for (int i=1; i<=9; ++i) {
coll.push_back(i);
}
//print all elements
for_each (coll.begin(), coll.end(),printInt);
cout << endl;
}
对于这个例子,for_each()的第三个参数,调用了printInt这个函数。在看下面的例子:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//simple function object that prints the passed argument
class PrintInt {
public:
void operator() (int elem) const {
cout << elem << ' ';
}
};
int main()
{
vector<int> coll;
//insert elements from 1 to 9
for (int i=1; i<=9; ++i) {
coll.push_back(i);
}
//print all elements
for_each (coll.begin(), coll.end(),PrintInt());
cout << endl;
}
在这个例子中,for_each()的第三个参数就是函数对象。
那么这到底有什么区别呢?也许从上面的代码中还看不出,但是,请继续看下面的例子:
//对每一个element加10;
void add10 (int& elem)
{
elem += 10;
}
void fl()
{
vector<int> coll;
...
for_each (coll.begin(), coll.end(),add10);
}
这样看起来似乎很好,但是,如果突然要求变了,要求对每一个element改成加9;那么,可能想到的办法是改写函数
void add9 (int& elem)
{
elem +=9;
}
哦,那么要求又改成+8、+7…… -3等等,总不至于对于每一个都重新写一个函数吧?虽然可行,但是违背
范型变成的思想。也许有新的办法:
template <int theValue>
void add (int& elem)
{
elem += theValue;
}
void f1()
{
vector<int> coll;
...
for_each (coll.begin() , coll.end(), //range
add<10>); //operation
}
但是,如果连类型(int)都变了(如改成float),那该怎么实现呢?哦,用一般的函数应该不能实现了吧?
但是如果用function object思想,就可以实现,看下面的代码:
template <class T>
class AddValue {
private:
T theValue;
public:
AddValue(T v) : theValue(v) {
}
void operator() (T& elem) const {
elem += theValue;
}
};
现在这个类就可以实现多个类型的相加形式了。
因此可以总结在用函数对象时,可以更加满足了STL的范型编程思想。
分享到:
相关推荐
### FunctionObject_函数对象 #### 定义与概念 函数对象(Function Object)是一种在C++编程语言中常见的设计模式,其核心在于将一个类的行为表现为一个函数的行为。具体来说,函数对象通常是指一个实现了调用操作...
C++成山似海的书籍堆中,这一本不是婴幼儿奶粉,也不是较大婴儿奶粉,它是成人专用的低脂高钙特殊奶粉。 对于C++底层机制感兴趣的读者,这本书会给你“漫卷诗书喜欲狂”的感觉。 了解C++ Object Model,是学习...
C++出错提示中英文对照详解 C++编程语言中,错误提示是开发者在编写代码时经常遇到的问题,本文将对常见的C++出错提示进行中英文对照详解。 1. Ambiguous operators need parentheses 不明确的运算需要用括号括起 ...
- Object Pascal的函数或过程声明中,参数类型写在变量名后面,如`function PayBack_d(var dAmount: double): double;`,其中`var`表示参数按引用传递。 6. **注释(Comments)**: - C++支持单行注释`//`和多行...
QT(C++)与Web的JS相互调用是现代跨平台应用开发中常见的需求,尤其在构建混合型应用时。QT库提供了一种强大的机制,允许C++代码与JavaScript环境进行交互,这主要通过QT的QWebChannel模块来实现。本实例将详细解释...
C++2005进一步完善了仿函数(function object)的概念,使得可以更加灵活地使用函数对象来包装各种操作。这增强了函数对象的重载和多态性,为算法提供了更多的自定义选项。 5. **异常安全编程**: 异常安全编程是...
std::priority_queue默认使用 Greater模板来生成一个function object来对元素进行比较,可以自定义一个function object来替代Greater,以便实现哈夫曼树结点的比较。 在实现哈夫曼算法时,需要注意以下几个关键点: ...
在C++编程中,错误是常见的挑战,程序员需要理解和解决这些错误来确保代码的正确运行。以下是一些在C++中可能出现的错误及其详细解释: 1. **Ambiguous operators need parentheses** - 当一个操作符的优先级不明确...
总之,《Inside C++ Object Model》深入探讨了C++中构造函数的工作机制,特别是默认构造函数和复制构造函数的合成规则。这些知识对于理解C++的对象创建和初始化过程至关重要,也是优化代码性能和避免潜在问题的基础...
1. 在C++中创建一个继承自`QObject`的类,并使用`Q_OBJECT`和`Q_INVOKABLE`标记需要在QML中调用的函数。 2. 注册C++对象到QML引擎,并设置为QML上下文的属性,以便在QML中访问。 3. 在QML中通过对象属性调用C++函数...
6. **STL(Standard Template Library)**:STL是C++标准库的一部分,包含容器(Container)、迭代器(Iterator)、算法(Algorithm)和函数对象(Function Object)。理解STL的工作原理和使用方法,能显著提升C++...
在iOS开发中,Objective-C是主要的编程语言,但有时候我们可能会遇到需要使用C或C++库的情况。本文将深入探讨如何在Objective-C项目中调用C和C++函数,以此来增强应用的功能和性能。 首先,Objective-C是苹果公司为...
myObject.cppSignal.connect(function() { console.log('Received signal from C++!'); }); }); ``` 通过这个简单的示例,我们可以看到QWebChannel如何在C++和JavaScript之间建立通信。它简化了复杂的接口...
在IT行业中,跨语言编程是一种常见的需求,C++和Python都是广泛应用的编程语言。C++以其高效、稳定和丰富的库支持而闻名,而Python则以其简洁的语法和强大的科学计算库受到青睐。当我们需要利用Python的某些功能,但...
- **1.7 The C++ memory model C++ 内存模型**:详细解释了 C++11 中内存的管理方式,包括线程间的数据共享机制。 - **1.8 The C++ object model C++ 对象模型**:阐述了 C++11 对象的生命周期和内存布局。 - **...
为了在C++中实现这个概念,我们可以使用函数指针、仿函数(Functor)、函数对象(Function Object)或std::function等工具。 1. 函数指针: 在C++中,我们可以直接使用函数指针来实现委托。例如,定义一个指向特定...
C++编程语言中,函数声明和定义是两个关键的概念,它们在程序的编译和链接过程中扮演着不同的角色。理解这两个概念对于编写大型、模块化的C++程序至关重要。 首先,函数声明(Function Declaration)主要是告诉...
本示例探讨了如何在C++程序中调用Python3的函数和类,这通常被称为“语言间互操作性”或“语言绑定”。这里我们将深入理解C++与Python3的交互过程,以及如何在Visual Studio 2015环境下实现这一目标。 首先,要让...
首先,我们需要了解C++20中的`std::reflect::metaobject`,它是类型信息的表示。每个类型都有一个唯一的`metaobject`,它包含了关于该类型的元数据,如其成员函数、数据成员等。`std::reflect::reflect`函数用于获取...
为了在C++中调用C#的DLL,我们需要借助COM(Component Object Model)或者P/Invoke技术。本文主要讲述P/Invoke的方式,因为它是.NET和非托管代码之间交互的常用手段。 1. **P/Invoke原理**: P/Invoke是.NET ...