`
izuoyan
  • 浏览: 9204169 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C++中的function object

阅读更多

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_函数对象

    ### FunctionObject_函数对象 #### 定义与概念 函数对象(Function Object)是一种在C++编程语言中常见的设计模式,其核心在于将一个类的行为表现为一个函数的行为。具体来说,函数对象通常是指一个实现了调用操作...

    《深度探索C++对象模型》(Stanley B·Lippman[美] 著,侯捷 译)

    C++成山似海的书籍堆中,这一本不是婴幼儿奶粉,也不是较大婴儿奶粉,它是成人专用的低脂高钙特殊奶粉。 对于C++底层机制感兴趣的读者,这本书会给你“漫卷诗书喜欲狂”的感觉。 了解C++ Object Model,是学习...

    c++出错提示中英文对照详解

    C++出错提示中英文对照详解 C++编程语言中,错误提示是开发者在编写代码时经常遇到的问题,本文将对常见的C++出错提示进行中英文对照详解。 1. Ambiguous operators need parentheses 不明确的运算需要用括号括起 ...

    c++语法与pascal语法的比较

    - Object Pascal的函数或过程声明中,参数类型写在变量名后面,如`function PayBack_d(var dAmount: double): double;`,其中`var`表示参数按引用传递。 6. **注释(Comments)**: - C++支持单行注释`//`和多行...

    QT(C++)与Web的JS相互调用实用例子

    QT(C++)与Web的JS相互调用是现代跨平台应用开发中常见的需求,尤其在构建混合型应用时。QT库提供了一种强大的机制,允许C++代码与JavaScript环境进行交互,这主要通过QT的QWebChannel模块来实现。本实例将详细解释...

    用好C++2005

    C++2005进一步完善了仿函数(function object)的概念,使得可以更加灵活地使用函数对象来包装各种操作。这增强了函数对象的重载和多态性,为算法提供了更多的自定义选项。 5. **异常安全编程**: 异常安全编程是...

    利用C++实现哈夫曼算法

    std::priority_queue默认使用 Greater模板来生成一个function object来对元素进行比较,可以自定义一个function object来替代Greater,以便实现哈夫曼树结点的比较。 在实现哈夫曼算法时,需要注意以下几个关键点: ...

    C++错误一览表(中英文对照)

    在C++编程中,错误是常见的挑战,程序员需要理解和解决这些错误来确保代码的正确运行。以下是一些在C++中可能出现的错误及其详细解释: 1. **Ambiguous operators need parentheses** - 当一个操作符的优先级不明确...

    Inside C++ Object Model 读书笔记(暂时第二章)

    总之,《Inside C++ Object Model》深入探讨了C++中构造函数的工作机制,特别是默认构造函数和复制构造函数的合成规则。这些知识对于理解C++的对象创建和初始化过程至关重要,也是优化代码性能和避免潜在问题的基础...

    qml和c++中的函数,互相调用的例子

    1. 在C++中创建一个继承自`QObject`的类,并使用`Q_OBJECT`和`Q_INVOKABLE`标记需要在QML中调用的函数。 2. 注册C++对象到QML引擎,并设置为QML上下文的属性,以便在QML中访问。 3. 在QML中通过对象属性调用C++函数...

    c++入门:《白话C++》

    6. **STL(Standard Template Library)**:STL是C++标准库的一部分,包含容器(Container)、迭代器(Iterator)、算法(Algorithm)和函数对象(Function Object)。理解STL的工作原理和使用方法,能显著提升C++...

    ios demo,object-c调用函数和c++函数

    在iOS开发中,Objective-C是主要的编程语言,但有时候我们可能会遇到需要使用C或C++库的情况。本文将深入探讨如何在Objective-C项目中调用C和C++函数,以此来增强应用的功能和性能。 首先,Objective-C是苹果公司为...

    QWebChannel Qt js c++ 互相调用 demo

    myObject.cppSignal.connect(function() { console.log('Received signal from C++!'); }); }); ``` 通过这个简单的示例,我们可以看到QWebChannel如何在C++和JavaScript之间建立通信。它简化了复杂的接口...

    C++调用python3.5中的函数

    在IT行业中,跨语言编程是一种常见的需求,C++和Python都是广泛应用的编程语言。C++以其高效、稳定和丰富的库支持而闻名,而Python则以其简洁的语法和强大的科学计算库受到青睐。当我们需要利用Python的某些功能,但...

    C++11最新使用手册

    - **1.7 The C++ memory model C++ 内存模型**:详细解释了 C++11 中内存的管理方式,包括线程间的数据共享机制。 - **1.8 The C++ object model C++ 对象模型**:阐述了 C++11 对象的生命周期和内存布局。 - **...

    C++下实现委托的代码

    为了在C++中实现这个概念,我们可以使用函数指针、仿函数(Functor)、函数对象(Function Object)或std::function等工具。 1. 函数指针: 在C++中,我们可以直接使用函数指针来实现委托。例如,定义一个指向特定...

    C++函数声明和定义

    C++编程语言中,函数声明和定义是两个关键的概念,它们在程序的编译和链接过程中扮演着不同的角色。理解这两个概念对于编写大型、模块化的C++程序至关重要。 首先,函数声明(Function Declaration)主要是告诉...

    C++调用Python3函数与类的实例代码

    本示例探讨了如何在C++程序中调用Python3的函数和类,这通常被称为“语言间互操作性”或“语言绑定”。这里我们将深入理解C++与Python3的交互过程,以及如何在Visual Studio 2015环境下实现这一目标。 首先,要让...

    C++ reflect 反射

    首先,我们需要了解C++20中的`std::reflect::metaobject`,它是类型信息的表示。每个类型都有一个唯一的`metaobject`,它包含了关于该类型的元数据,如其成员函数、数据成员等。`std::reflect::reflect`函数用于获取...

    c++动态加载c#编写生成的dll代码

    为了在C++中调用C#的DLL,我们需要借助COM(Component Object Model)或者P/Invoke技术。本文主要讲述P/Invoke的方式,因为它是.NET和非托管代码之间交互的常用手段。 1. **P/Invoke原理**: P/Invoke是.NET ...

Global site tag (gtag.js) - Google Analytics