1

memcpy のテンプレートバリアントを書きたい:

template< typename T > 
inline T& MemCopy( T& dest, const T& src )
{
  *( T* )memcpy( &dest, &src, sizeof( src ) ) ;
}

VS2010 で次のコードをコンパイルしようとすると:

typedef short AMSync[ 4 ] ;
static AMPSync aSync ;

void Init( const AMPSync& sync )
{
   MemCopy( aSync, sync ) ;
}

エラーが発生します:

'T &MemCopy(T &,const T &)' : template parameter 'T' is ambiguous
          : see declaration of 'MemCopy'
          could be 'const short [4]'
          or       'AMPSync'

私が使用する場合:

template< typename T1, typename T2 > 
inline T1& MemCopy( T1& dest, const T2& src )
{
   *( T1* )memcpy( &dest, &src, sizeof( src ) ) ;
}

エラーはありませんが、この場合、コンパイラは引数のサイズをチェックできません

両方の目的を達成する方法はありますか。

4

1 に答える 1

0
template<typename T1, typename T2> 
T1& MemCopy(T1& dest, const T2& src)
{
   static_assert(sizeof(src) == sizeof(dest));
   return *reinterpret_cast<T1*>(memcpy(&dest, &src, sizeof(src)));
}

また

template<typename T1, typename T2> 
typename std::enable_if<sizeof(T1) == sizeof(T2), T1&>::type MemCopy(T1& dest, const T2& src)
{
   return *reinterpret_cast<T1*>(memcpy(&dest, &src, sizeof(src)));
}

なぜあなたはこれをしたいのですか?あなたの例は次のようにするとより良いでしょう:

static AMPSync aSync ;

void Init( const AMPSync& sync )
{
    aSync = sync;
}
于 2013-04-04T12:18:46.313 に答える