提问人:itsrxmmy 提问时间:11/3/2023 更新时间:11/8/2023 访问量:139
如何向标准库中的类添加新方法
how do I add new methods to a class in the standard library
问:
我想从标头扩展类。我计划添加几个函数,例如 、 等。std::fstream
<fstream>
std::fsteam create(path)
std::vector<std::string> read_lines(path)
我问的很简单。我希望能够简单地在另一个文件中添加方法,然后创建对象并使用这些新方法,而不是创建一个全新的类。std::fstream
我有两个文件。 我将在这里声明方法,在哪里定义它们并将它们链接到我的文件。file_helper.hh
file_helper.cc
main.cc
那么,如果可能的话,我应该写什么来添加这些新方法呢?甚至可能吗?file_helper.hh
std::fstream
答:
4赞
Aykhan Hagverdili
11/3/2023
#1
在 C++ 中执行此操作的方法是添加您自己的独立函数以及您想要的功能:
// stdex.h
#include <string>
#include <fstream>
#include <vector>
namespace stdex
{
std::vector<std::string> read_lines(std::ifstream& self);
}
然后你只需像使用任何函数一样使用它们:
// main.cpp
#include <fstream>
#include <iostream>
#include "stdex.h"
int main()
{
std::ifstream file{"foobar.txt"};
for (const auto& line : stdex::read_lines(file)) {
std::cout << line << '\n';
}
}
评论
0赞
itsrxmmy
11/3/2023
所有这一切都是将对象作为参数,这不是我想要做的,我希望能够像这样使用它,但上面告诉我这是不可能的。std::fstream my_file("foobar.txt"); std::cout << my_file.read_lines()[4];
0赞
Aykhan Hagverdili
11/3/2023
@itsrxmmy 这有什么不同/更好?std::cout << read_lines(my_file)[4];
0赞
itsrxmmy
11/3/2023
我只是想知道是否有可能这样做。我已经知道如何将参数放入函数中,这基本上就是这个解决方案的全部内容。并不是说它有什么不同或更好,我只是喜欢玩 C++,看看某些线在哪里画,有多少变通方法。
0赞
Aykhan Hagverdili
11/3/2023
@itsrxmmy,我正在向你展示你试图实现的目标是如何以C++方式完成的。如果你唯一的论点是“我特别想要这个语法”,那么我帮不了你。
0赞
itsrxmmy
11/3/2023
没问题。感谢您抽出宝贵时间接受采访
0赞
Ted Lyngmo
11/8/2023
#2
您描述的内容如下所示。但请注意:
- 您建议的函数都采用路径参数。必须创建你的实例才能调用或没有意义。这些函数会比免费函数好得多。
fstream
create(path)
read_lines(path)
#include <filesystem>
#include <fstream>
#include <string>
#include <vector>
class myfstream : public std::fstream { // inherit from std::fstream
public:
// make the fstream constructors and assignment operators available
using std::fstream::fstream;
using std::fstream::operator=;
// example implementations of your member functions:
std::fstream create(std::filesystem::path path) const {
return {path, std::ios::out};
}
std::vector<std::string> read_lines(std::filesystem::path path) const {
std::vector<std::string> rv(1);
if (std::ifstream is(path); is) {
for (; std::getline(is, rv.back()); rv.emplace_back()) {}
}
rv.resize(rv.size() - 1);
return rv;
}
};
评论
fstream
create