2016-04-02 15 views
3

私は読み取りと書き込みの構造体をボイドポインターに変換するよりも、その後、次のように関数にサイズを渡すために、よりエレガントな方法を見つけようとしています:暗黙の型変換:ないクラスのメンバや構造体

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テンプレート構造体にするだろう。私はこの構造体を使用して作成する書き込み関数もテンプレート化する必要があるため、これは嫌です。

私の質問は:構造体やクラスの一部ではない暗黙の変換関数を作成できますか(これを行うより良い方法があれば)?

答えて

2

テンプレート化された構造体は必要ありません。テンプレート化された構造体は必要ありません。このような何か:

#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 
+0

申し訳ありませんが、私はあなたがコンストラクタをテンプレートができることを認識していなかった....それはかなり便利です!ありがとう – DarthRubik

関連する問題