类成员初始化程序初始化ifstream并进行错误检查?

时间:2016-10-04 17:14:24

标签: c++ c++11

我正在尝试使用类成员初始化程序的C ++ 11特性来初始化类的变量。我所拥有的类的变量是std :: string和std :: ifstream。

class A{
    std::string filename = "f1.txt";
    std::ifstream filestream = ....
public:
    ....
};

有没有办法初始化文件流,并使用类成员初始化同时检查错误。

我想做的是,类似于下面的内容:

class A{
    std::string filename = "f1.txt";
    std::ifstream filestream(filename);
    if(filestream.is_open()) .... // check if file cannot be opened
public:
    ....
};

1 个答案:

答案 0 :(得分:2)

您可以编写并调用执行相应检查的内联lambda表达式;这样的lambda表达式可以访问数据成员:

class A {
    std::string filename = "f1.txt";
    std::ifstream filestream = [&] {
        std::ifstream fs{filename};
        if (!fs)
            throw std::runtime_error("failed to open ifstream");
        return fs;
    }();
};

filename作为参数,例如将逻辑分离为可重用的辅助函数可能更清楚。静态成员函数:

class A {
    std::string filename = "f1.txt";
    std::ifstream filestream = openChecked(filename);
    static std::ifstream openChecked(std::string const& filename)
    {
        std::ifstream fs{filename};
        if (!fs)
            throw std::runtime_error("failed to open ifstream");
        return fs;
    }
};