Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 隐式类型转换:不是类或结构的成员_C++_Implicit Conversion - Fatal编程技术网

C++ 隐式类型转换:不是类或结构的成员

C++ 隐式类型转换:不是类或结构的成员,c++,implicit-conversion,C++,Implicit Conversion,我试图找到一种更优雅的方法来读取和写入结构,而不是将其转换为空指针,然后像这样将大小传递给函数: void write(void* value, size_t length); //Write is some random write function Type var; write((void*)var,sizeof(Type)); void write(VoidPtrReplacement* value); Type var; write(var); #include &l

我试图找到一种更优雅的方法来读取和写入结构,而不是将其转换为空指针,然后像这样将大小传递给函数:

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

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

Type var;
write(var);
#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);
}
因此,我尝试创建一个方法,将任何类型隐式转换为结构,如下所示:

struct VoidPtrReplacement{
  uint8_t* bytes;
  size_t size;
};
然后我可以(如果我能找到一种方法,从任何其他类型隐式转换为这种类型)创建这样的读写函数:

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

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

Type var;
write(var);
#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);
}
不幸的是,我能找到的从任何其他类型转换为该类型的唯一方法是将VoidPtrReplacement设置为模板结构。我不想这样做,因为我创建的任何使用此结构的写函数也必须模板化


所以我的问题是:我可以创建一个不属于任何结构或类的隐式转换函数吗(或者如果有更好的方法),你不需要一个模板化的结构,只需要一个模板化的构造函数。大概是这样的:

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

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

Type var;
write(var);
#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);
}

很抱歉,我没有意识到你可以模板一个构造函数…这是非常有用的!谢谢