Skip to content

C++中简单实现 foreach 循环 #14

Open
@jamesfancy

Description

@jamesfancy

看别人用 Qt 写的程序时,偶然发现虽然程序中用到了 foreachforeach 本来不是 C++ 的关键字,但 Qt 是如何实现的呢?查看 Qt 的文档,里面说是用 preprocesser (预处理) 实现的。研究了一下,原来是宏定义。

foreach 宏的实质就是在宏中定义循环申明部分,而不包括循环体。在使用的时候,紧接着写循环体就行了。下面用 std::vector<std::string> 写了一个简单的示例。

#include <iostream>
#include <string>
#include <vector>

using namespace std;

#define foreach(var, list, type) 
    for (type::iterator var = list.begin(); var != list.end(); var++)

int main(int argc, char* argv[]) {
    vector<string> ss;
    ss.push_back("first");
    ss.push_back("second");
    ss.push_back("third");
    ss.push_back("fourth");
    ss.push_back("fifth");

    foreach (item, ss, vector<string>) {
        cout << *item << endl;
    }

    return 0;
}

不过从这个示例看来,这样定义的 foreach 并不能通用,如果遇到 set 还好,遇到 map 就傻了。也不能支持自定义的集合类型。要写一个通用性好一点的 foreach,可能还需要写一两个类来辅助才行。问题先放在这里,空了再仔细研究研究。

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions