c++ - memcpy 模板变体中的错误

标签 c++ templates

我想编写 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 ) ) ;
}

然后就没有错误了,但是在这种情况下编译器无法检查参数的大小

有没有办法同时达到这两个目的。

最佳答案

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;
}

关于c++ - memcpy 模板变体中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15810689/

相关文章:

c++ - boost 功能模板错误

c++ - 模板化 lambda 的显式实例化

c++ - 在 C++11 中使用模板元编程连接列表

javascript - 使用 Chrome Javascript 应用程序在本地驱动器上执行 HTML

c++ - VS2015 无法理解静态内联函数

C++ 模板专门化,使用 typename 时出错

c++ - 为什么 std::is_function 对简单函数和 lambda 返回 false?

c++ - 访问包含它的 vector 元素时,类对象的运算符重载不起作用?

此类的 C++ 特征示例

c++ - 如果 lambda 中带有 static_assert 的 constexpr,哪个编译器是正确的?