【问题标题】:Implicit Type Conversion: Not Member of Class or Struct隐式类型转换:不是类或结构的成员
【发布时间】:2023-03-05 02:05:01
【问题描述】:

我试图找到一种更优雅的方式来读取和写入结构,而不是将它们转换为 void 指针,然后将大小传递给函数,如下所示:

void write(void* value, size_t length);    //Write is some random write function

Type var;
write((void*)var,sizeof(Type));  

所以我试图创建一个方法来将任何类型隐式转换为如下结构:

struct VoidPtrReplacement{
  uint8_t* bytes;
  size_t size;
};

然后我可以(如果我能找到一种方法从任何其他类型隐式转换为这种类型)创建像这样的不错的读写函数:

void write(VoidPtrReplacement* value);

Type var;
write(var);

不幸的是,我能找到从任何其他类型转换为这种类型的唯一方法是将 VoidPtrReplacement 设为模板化结构。我不想这样做,因为我创建的任何使用这个结构的写函数也必须被模板化。

所以我的问题是:我可以创建一个不属于任何结构或类的隐式转换函数(或者是否有更好的方法来做到这一点)?

【问题讨论】:

    标签: c++ implicit-conversion


    【解决方案1】:

    您不需要模板结构,只需要模板构造函数。像这样的:

    #include <iostream>
    #include <vector>
    
    struct VoidPtrReplacement{
        const unsigned char *bytes;
        size_t size;
    
        template<typename T>
        VoidPtrReplacement(T &&t)
            : bytes(reinterpret_cast<unsigned char *>(&t)),
              size(sizeof(T))
        {
        }
    };
    
    void write(const VoidPtrReplacement &p)
    {
        std::cout << "Write: " << (void *)p.bytes << ", " << p.size << " bytes"
              << std::endl;
    }
    
    class Foo {
        int i=4;
    };
    
    class Bar {
        char c=0;
        int b=3;
    };
    
    int main()
    {
        Foo foo;
        Bar bar;
    
        std::cout << "Address of foo: " << &foo << std::endl;
        std::cout << "Address of bar: " << &bar << std::endl;
    
        write(foo);
        write(bar);
    }
    

    样本输出:

    Address of foo: 0x7ffd5eba4c80
    Address of bar: 0x7ffd5eba4c60
    Write: 0x7ffd5eba4c80, 4 bytes
    Write: 0x7ffd5eba4c60, 8 bytes
    

    【讨论】:

    • 对不起,我没有意识到您可以模板构造函数....这非常有用!谢谢
    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 2021-10-27
    • 2012-05-07
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多