initializer_lists of streams(C ++ 11)

时间:2013-12-18 18:29:13

标签: c++11 ofstream initializer-list

我正在尝试将可变数量的流传递给接受initializer_list但似乎不起作用的函数,并且从initializer_list结构中抛出所有可能的错误以及我的函数如何与一组ofstreams不能相同匹配任何已定义的函数。

实际上是否可以在initializer_list中传递ofstreams的引用?

TEST.CPP

#include "extension.h"


ofstream outputFile, outputFile2;

int main(void) {

    outputFile.open(("data_1.txt");
    outputFile2.open("data_2.txt");
    writeSomething({outputFile, outputFile2});
    outputFile.close();
    outputFile2.close();
}

extension.h

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <string.h>
#include <initializer_list>

using namespace std;

void writeSomething(initializer_list<ofstream&> args);

extension.cpp

#include "extension.h"

void writeSomething(initializer_list<ofstream&> args) {
    for (auto f : args ) {
        f << "hello" << endl;
    }
}

1 个答案:

答案 0 :(得分:2)

clang 3.4(trunk 194324)产生一个非常明确的错误消息:

  

initializer_list:54:23:错误:'iterator'声明为指向a的指针   类型的参考文献         'std::basic_ofstream<char> &'
        typedef const _E* iterator;

所以不,这是不可能的。另见Error: forming pointer to reference type 'const std::pair&'… I can't understand this error

(由于某些内部编译器错误,gcc 4.7.2和4.8.1在此代码上崩溃。我已提交bugreport。)

你可以做的是传递指针而不是引用,如下所示:

#include <fstream>
#include <initializer_list>

using namespace std;

void writeSomething(initializer_list<ofstream*> args) {
    for (auto f : args )
        *f << "hello" << endl;
}

int main() {
    ofstream outputFile("data_1.txt");
    ofstream outputFile2("data_2.txt");
    writeSomething({&outputFile, &outputFile2});
}

但是,我宁愿使用std::vector代替。为此目的使用初始化列表对我来说非常奇怪和困惑。