我想编写 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/