如何为这种情况编写赋值运算符?

Posted

技术标签:

【中文标题】如何为这种情况编写赋值运算符?【英文标题】:How to write an assignment operator for this case? 【发布时间】:2012-11-02 19:59:54 【问题描述】:

我有一些代码在 MSVC 上编译得很好,但现在我将它移植到 Clang 并且在编写赋值运算符时遇到了麻烦,我猜这在 MSVC 中被认为是隐含的。这是我得到的代码:

enum EBufferPacking 
    Invalid = -1, UInt1, Int8, Int16, Float32
;

template<EBufferPacking p>
class PackedBufferRef;

template<>
class PackedBufferRef<UInt1> 
    unsigned char *const m_pBuffer;
    const unsigned char m_nMask; 
public:
    explicit PackedBufferRef<UInt1>(void *buffer, int offset):
        m_pBuffer((unsigned char *)buffer + offset/8),
        m_nMask(1<<(offset%8))
    

    operator float() const
    
        return (*m_pBuffer & m_nMask) ? 1.0f : 0.0f;
    

    template<class T>
    PackedBufferRef<UInt1> &operator =(const T &t)
    
        if (!t) // write 0
            *m_pBuffer &= ~m_nMask;
        else
            *m_pBuffer |=  m_nMask;
        return *this;
    
    PackedBufferRef<UInt1> &operator =(const PackedBufferRef<UInt1> &ref)
    
        if( !(*ref.m_pBuffer & ref.m_nMask) )
            *m_pBuffer &= ~m_nMask;
        else
            *m_pBuffer |=  m_nMask;
        return *this;
    
;


template<class T>
class BytePackedBufferRef
protected:
    T *const m_pBuffer; // dont assign new pointers
    BytePackedBufferRef<T>(void *buffer, int offset): m_pBuffer((T *)buffer + offset) 

    BytePackedBufferRef &operator=(const BytePackedBufferRef &other) 
        // assignment operator should go here   
    
public:
    operator T*() const  return m_pBuffer; 
    operator T() const  return *m_pBuffer; 
;

template<>
class PackedBufferRef<Float32>:public BytePackedBufferRef<float> 
public:
    explicit PackedBufferRef<Float32>(void *buffer, int offset):BytePackedBufferRef<float>(buffer, offset) 
    template<class T> PackedBufferRef<Float32> &operator =(const T &t)  *m_pBuffer = (float)t; return *this; 
;

int main()

    float fx = 0.5f;
    float fy = 1.7f;

    PackedBufferRef<Float32> firstRef(&fx, 0);
    PackedBufferRef<Float32> secondRef(&fy, 0);

    firstRef = secondRef;

    printf("First ref: %.2f\n", (float)firstRef);
    printf("Second ref: %.2f\n", (float)secondRef);

    return 0;

从 main 函数你可以看到我想要的结果:我想从赋值的 RHS 上的变量中取出 m_pBuffer,并将其放入 LHS 变量上的 m_pBuffer 中。 PackedBufferRef 特化有一个赋值运算符来执行此操作,但它只是将赋值传递给BytePackedBufferRef 类型,其m_pBuffer 成员被声明为const。在这种情况下,我该如何编写赋值运算符?

【问题讨论】:

您要复制指针或其内容吗?如果你想复制指针,而目的地是const,恐怕你就不走运了。 从实际代码中调用它的代码来看(我只是在 main 函数中放了一个示例调用用于演示目的)我会说它只需要复制内容。 【参考方案1】:

如果你坚持,你可以这样做......

BytePackedBufferRef &operator=(const BytePackedBufferRef &other) 
    // assignment operator should go here 
    T** pp = (T**)&m_pBuffer;
    *pp = other.m_pBuffer;  

【讨论】:

以上是关于如何为这种情况编写赋值运算符?的主要内容,如果未能解决你的问题,请参考以下文章

如何为从C++中的模板继承的类重载赋值运算符

在 C++ 中编写复制构造函数和赋值运算符的清单

在这种情况下,链式赋值运算符如何工作 [重复]

对象的赋值运算符

C/C++编程笔记:用C++编写赋值运算符,一般什么情况下用?

分享------关于复合赋值运算符