运算符重载是编程语言的一个特性,它允许运算符的自定义实现,具体取决于所涉及的操作数的类型。有些语言允许定义新的运算符,而其他语言只允许重新定义现有的运算符。
如何超载<<opeartor(double const&) in an inherited std::stringstream
我想覆盖 < 我想覆盖 <<opeartor 这样 double d = 3.0; mycustomstringstream << "Hello World " << d << "what a nice day."; std::cout << mystream.str() << std::endl; 将产生监视器输出 Hello World (double)(3.00000000000)what a nice day. 我尝试了什么 压倒一切 因为我可以像这样打印双打,所以我大胆地实现了: std::ostream& operator<<(std::ostream& o, double const& d){ o<<"(double)("<< d << ")"; return o; } 这不起作用,因为编译器会解释歧义(因为该运算符已经定义)。 继承 就像一开始一样,我可以从 std::stringstream 继承,只需替换我的自定义字符串流的该运算符的定义即可: #include<sstream> class MyCustomStringStream: public std::stringstream{}; MyCustomStringStream& operator<<(MyCustomStringStream& o, double const& d){ o<<"(double)("<< ( (std::stringstream)(o) << d ) << ")"; return o; } 这里的错误是: error: use of deleted function 'std::__cxx11::basic_stringstream<_CharT, _Traits, _Alloc>::basic_stringstream(const std::__cxx11::basic_stringstream<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]' 那么那么: #include <iostream> #include <sstream> class MyStringStream: public std::stringstream{ std::stringstream aux; public: MyStringStream& operator<<(double const& d){ aux.str() = ""; aux << std::scientific << "((double)(" << d << ")"; *this << aux.str(); return *this; } }; int main() { double d = 12.3; MyStringStream s; s << "Hello World " << d << "what a nice day."; std::cout << s.str() << std::endl; } 但这仍然印着我 Hello World 12.3what a nice day. 演示[ https://godbolt.org/z/daG3bo6hv ] 无论你怎么想,继承通常都不是问题。无论如何,我不会从流派生(通常不建议从 STL 类型继承,尽管流允许这样做)。 对于您的情况,有一个更可重用的解决方案,制作一个辅助格式化对象: #include <iostream> #include <sstream> template<typename type_t> struct as_scientific { type_t value; }; template<typename type_t> std::ostream& operator<<(std::ostream& os, const as_scientific<type_t>& scientific) { os << std::scientific << "((" << typeid(type_t).name() << ")(" << scientific.value << ")"; return os; } int main() { double d = 12.3; std::ostringstream s; s << "Hello World " << as_scientific{d} << "what a nice day."; std::cout << s.str() << "\n"; // or directly std::cout << as_scientific{d} << "\n"; }
我们都知道并喜爱 Ada.Containers.Vectors。这是其用法的示例: 与 Ada.Text_IO; 与 Ada.Containers.Vectors; 程序示例是 使用 Ada.Text_IO; 包 Vectors_Integer 是 ...
我有一个名为 Matrix 的类。我想要重载运算符!返回矩阵的转置。 当主矩阵是一个未命名的对象时,我更喜欢使用它分配的内存来构造转置矩阵,
我有 2 个带有 + 运算符重载的点类: Point2D 类: x = 0 y = 0 def __add__(self, __other: "Point2D"): 返回 Point2D(self.x + __other.x, self.y + __ot...
为什么拥有<< operator in a global namespace?
我有这段代码,但我不明白它是如何工作的: #包括 #包括 #包括 #包括 typedef std::pair elem...
我正在尝试创建一个可以隐式转换为各种不同类型(基元和自定义定义的类)的类。我希望能够转换为的类型之一是 std::...
+= python 中的 __setitem__ 运算符(添加方括号)
在以下语句中定义类行为: 我的对象[项目] = ... 我知道我需要定义 __setitem__ 方法。 我需要为以下语句定义什么方法: 我的_obj...
我有一个模板结构 Foo,它定义了一个内部结构 Bar。 现在,我想重载流运算符 << for this inner struct Bar but the compiler seems to ignore my overload
如何重载 std::tuple 的索引 [] 运算符?因此,当我有 std::tuple tup 并输入 tup[0] 时,我希望它返回对 get<0>(tup) 的引用....
所以我有一个模板类 TargetVar,它本质上只是另一个变量的包装器,这样我就可以为所述变量设置目标值以及达到该 v 需要多少帧...
我想包装一个新类来生成一个文件,并对新文件进行一些自动资源回收和一些额外的操作。 所以我开设了一个新课程,例如 类 TmpFile { 私人的: std::字符串
考虑下面的 Foo 类,它提供了 2 个运算符 (),一个用于读取,另一个用于写入。 #包括 #包括 模板
我想制作使用动态数组的记录类型。 使用这种类型的变量 A 和 B,我希望能够执行操作 A:= B (和其他)并能够修改内容 o...
假设我有一个通用矩阵类型: 类矩阵 { 私有 T[,] _data; } 当且仅当 T 有一个重载的 + 运算符时,是否可以重载 Matrix 上的 + 运算符?
Clang-Tidy 不明确:operator++(int) 应该返回什么?
因此,我一直在为一项作业开发 Vector 实现,并在实现迭代器时注意到一些奇怪的 Clang-Tidy 建议。 迭代器必须有迭代器&运算符...
我的问题如下:我想设置一个具有更有限值范围的类似原始结构。如在 #[repr(透明)] 结构 MyLimitedInt { 五:i8, } 但要确保 v 的值为
C++ 运算符的泛型重载<< for STL containers produces ambiguous overload error with strings
我的意思是编写一个通用的运算符重载<< to print STL containers. I put together code below. Whenever operator<< involves a string, it produces a compilation error ambiguous ove...
我有以下代码: #包括 基类{ 民众: 虚空运算符()(int &x) = 0; 无效运算符()(int &&x){ 运算符()(x); } }; 班级
我正在 flutter 中制作一个自定义数字类,并希望在该类与普通整数和双精度数之间进行基本算术运算。 所以我在类定义中重载了乘法运算符并且