2011-02-14 22 views
8

如何檢查C++類型是否可以複製?我有一個類,它使用具有指定模板類型T的memcpy和memcmp函數,並且我想爲類型啓用斷言,這對於使用memcpy複製是不安全的。有沒有辦法做到這一點(與現有的標準)?C++ is_trivially_copyable檢查

+2

您可能可以使用`is_pod`類型特徵。 「你可以安全地使用`memcpy`複製」的定義是什麼?如果一個對象有一個指向擁有動態分配對象的指針數據成員,那麼「安全地用`memcpy`複製」? – 2011-02-14 16:15:30

+0

@James:定義是簡單的拷貝構造函數 - 也就是說,類型沒有用戶定義的拷貝構造函數,也沒有任何基類或數據成員。 – Puppy 2011-02-14 16:17:57

+1

標準定義「一個可複製的類是一個類: - 沒有非平凡的複製構造函數(12.8), - 沒有非平凡的複製賦值運算符(13.5.3,12.8), - 具有微不足道的析構(12.4)「。 – axe 2011-02-14 16:20:14

回答

8

不,在C++ 98/C++ 03中不可能。像這樣的事情是爲什麼<type_traits>被添加到C++ 0x。 <type_traits>中的一些功能可以在C++ 03中實現,通常使用SFINAE原則,但包括std::is_trivially_copyable<T>在內的幾個功能只需要內置的編譯器支持。

6

在boost中有這種類型的特徵。

但是,如果類型 trivially copyable,那麼您正在浪費時間 - memcpying類型不會比優化程序使用複製構造函數生成的速度更快。只需使用複製構造函數即可。