gpt4 book ai didi

c++ - 运算符重载 C++ : write-only version

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:32 26 4
gpt4 key购买 nike

我正在重载数据结构的运算符,所以我有标准的函数声明:

T & operator[](int i);    //used for regular objects
const T & operator[](int i) const; // used for const objects

所以我想做的是为常规对象提供两个版本的 operator[]:当 operator[] 用于写入而不是读取时,一个会做一些不同的事情。

我一直在读到这是可能的,但我还没有看到任何代码。

这个问题我已经看过很多次了,也看到了“'operator[] const' version is used for reading”的回答 --> 但事实并非如此;它仅与类的 const 实例一起使用。

任何人都可以提供有关检测写入事件以触发不同行为的指导吗?也许是复制构造函数中的技巧?

最佳答案

持有对象的类无法获取您对返回对象的访问权限是读访问还是写访问的信息。

只有对象本身通过成员函数限定符有一些“我在哪个上下文中使用”的概念。

  • Ref 限定符
  • const/volatile 限定符

您可以在代理类中使用它。

#include <vector>
#include <type_traits>
#include <iostream>

template <class T, class U = T, bool Constant = std::is_const<T>::value>
class myproxy
{
protected:
U& m_val;
myproxy& operator=(myproxy const&) = delete;
public:
myproxy(U & value) : m_val(value) { }
operator T & ()
{
std::cout << "Reading." << std::endl;
return m_val;
}
};

template <class T>
struct myproxy < T, T, false > : public myproxy<T const, T>
{
typedef myproxy<T const, T> base_t;
public:
myproxy(T & value) : base_t(value) { }
myproxy& operator= (T const &rhs)
{
std::cout << "Writing." << std::endl;
this->m_val = rhs;
return *this;
}
};

template<class T>
struct mycontainer
{
std::vector<T> my_v;
myproxy<T> operator[] (typename std::vector<T>::size_type const i)
{
return myproxy<T>(my_v[i]);
}
myproxy<T const> operator[] (typename std::vector<T>::size_type const i) const
{
return myproxy<T const>(my_v[i]);
}
};

int main()
{
mycontainer<double> test;
mycontainer<double> const & test2(test);
test.my_v.push_back(1.0);
test.my_v.push_back(2.0);
// possible, handled by "operator=" of proxy
test[0] = 2.0;
// possible, handled by "operator T const& ()" of proxy
double x = test2[0];
// Possible, handled by "operator=" of proxy
test[0] = test2[1];
}

打印

WritingReadingReadingWriting

关于c++ - 运算符重载 C++ : write-only version,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26005383/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com