我想创建一个带有成员函数的类,可以用作std :: cout。为了演示这个问题,我创建了这个代码示例
#include <iostream>
#include <string>
class myClass
{
public:
void myFunc(? data)
{
std::cout << data << std::endl;
}
};
int main()
{
myClass myObject;
int var = 1;
myObject.myFunc() << "Text" << var;
}
正如您所看到的,我想将参数传递给函数,就好像我会直接使用std::cout
一样。那可能吗?我在网上搜索并阅读了很多内容,但没有让它工作,任何人都可以帮助或链接一个包含更多信息的页面吗?
答案 0 :(得分:3)
您无法调用myObject.myFunc()
并让它传递这些参数。如果你把它称为()
,那么它没有参数。
要使用x << y
之类的iostream语法,您需要myFunc()
返回重载operator<<
的内容,以便myFunc() << "Text"
能够正常工作。显而易见的答案是只返回对std::cout
本身的引用:
class myClass
{
public:
std::ostream& myFunc()
{
return std::cout;
}
};
但它可以是对std::ostream
类派生的不同对象的引用,因此支持operator<<
,例如对std::ofstream
的引用会写入文件而不是标准输出:
class myClass
{
std::ofstream m_outputFile{ "output.txt" };
public:
std::ostream& myFunc()
{
return m_outputFile;
}
};
答案 1 :(得分:3)
std::cout
“通过使用二元运算符”operator<<
(也称为流运算符或左移运算符)来获取输入。它可以是一个类的方法,例如:
class A {
public:
template <typename T>
A& operator<<(const T& x) {
// do stuff with x
return *this;
}
}
或独立的二元函数:
class A { ... };
template <typename T>
A& operator<<(A& lhs, const T& rhs) {
// do stuff with A and rhs
return lhs;
}
在您的情况下,可以将“流式传输”数据传输到myClass
:
直接,不像你的问题,但与std::cout
一样:
class myClass {
public:
template <typename T> void myFunc(const T& data) { ... }
}
template <typename T>
myClass& operator<<(myClass& lhs, const T& rhs) {
lhs.myFunc(rhs);
return lhs;
}
使用myFunc()
返回的代理对象:
class myClass {
public:
struct StreamingProxy { A const & ref; }
StreamingProxy myFunc() { return StreamingProxy{*this}; }
}
template <typename T>
myClass::StreamingProxy operator<<(myClass::StreamingProxy lhs, const T& rhs) {
lhs.ref.myFunc(data);
return lhs;
}
这段代码有点像“草图”,但确实是work。