c++ - 当对象位于赋值的右侧时重载赋值运算符

标签 c++ operator-overloading

给定以下代码:

template <typename T>
struct Wrapper {
    T value;
    Wrapper(T val) : value(val) {}
}

int main() {
    Wrapper<int> x(42);
    int y = x; // need solution for y = x.value
    return 0;
 }

有没有办法实现赋值

int y = x;

所以它意味着 y = x.value 。

我知道重载赋值运算符本身是不可能的,因为它适用于赋值左侧的对象,并且标准不允许带有两个参数的友元函数。

如果通过重载任何其他运算符或使用一些特殊技巧无法做到这一点,您将如何实现它,除非调用 Wrapper 类提供的 get 方法,例如:

int y = x.get();

最佳答案

为什么不直接提供到 T 的隐式转换呢?

operator T() { return value; } 

这将导致赋值起作用,因为编译器将尝试将赋值的右侧转换为 T .隐式转换将允许它成功

请注意,这将导致除赋值之外的其他转换起作用。例如,现在可以传递 Wrapper<T>实例为 T参数。这可能适用于您的特定场景,也可能不适用

关于c++ - 当对象位于赋值的右侧时重载赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18196319/

相关文章:

fortran - Fortran 中的重载赋值运算符和 ELEMENTAL 赋值运算符

c++ - 模板类的友元运算符

c++ - 根据传入命令选择和执行任务的模式/架构

c++ - operator= 从模板类重载

c++ - 是否有适用于 Windows 的优秀 C++ XML DOM 教程?

c++ - 就 ABI 兼容性而言,静态库的行为是否与动态库类似?

c++ - operator= 和 C++ 中不继承的函数?

c++ - Printf 疯了

c++ - 具有单位 vector 约束的非线性优化

c++ - Armadillo C++ 中的逐元素 vector 或矩阵乘法