2013-04-04 57 views
1

的模板變種我想寫的memcpy的模板變種:錯誤的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)) ; 
} 

然後錯誤不存在,但在這種情況下編譯器無法檢查參數的大小

是否有辦法實現這兩個目的。

+0

你可以添加一個[tag:static-assert]到第二個變體。 – 2013-04-04 12:13:53

+2

我花了幾分鐘想知道這個,然後意識到你可能只是有一個錯字。 'AMPSync!= AMSync'。 [This](http://liveworkspace.org/code/1Z7Dq5$4)編譯。 – BoBTFish 2013-04-04 12:46:28

回答

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

感謝大家的回答。但我看到我並不確切。我希望只有const修飾符才能使這些類型的參數不同。作爲與assigment的調整變體。如果派生運算符(=)對某些類受到保護,它將生成編譯器錯誤。當然,如果這樣做了,那麼簡單的複製不會被記錄下來,但在某些情況下它可能是需要的。 – user1807338 2013-04-06 12:07:24