2014-11-06 62 views
0

我設計了我自己的std :: vector實現,我稱其爲il :: vector。我想要麼:防止在模板中使用某些類型

  • 專營它,你可以使用複製型memcpyintdoublestd::array<double, n>,等等)。
  • 對於不能用memcpy複製的類型使用不同的類,例如std::vector。在後一種情況下,如果我想用某些不能用memcpy複製的內容(例如il::vector<std::vector<double>>)進行實例化,我想要編譯時錯誤。

有沒有辦法做到這一點? PS:我總是得到如下答案:你應該使用std :: vector來代替。我用我自己的圖書館,主要理由是:

  • 我想用一個指針來構造我的IL ::向量不被複制的數據
  • 我想用ptrdiff_t的作爲數組的索引,而不是這個的愚蠢的 size_t。使用無符號整數索引是STL最糟糕的想法之一。即使Stroustrup似乎也反對它。
  • 我想用我自己的分配器來設計分配器,而不是爲90年代這個設計用於不同目的的奇怪模型。

對不起有點粗魯,但我厭倦了:STL是上帝,甚至不說它不符合你的需求。

+0

@ user657267我真的不明白你的答案。此外,我不想使用C++庫。 – InsideLoop 2014-11-06 08:13:15

+0

關鍵是'std :: copy'已經在可複製的類型上執行了'memcpy'或等價物,否則就使用拷貝構造函數。 '我不想使用C++ Library'然後重新創建輪子。 – user657267 2014-11-06 08:16:38

+0

@ user657267:我正在開發通常由Fortran/C/Delphi調用的庫。當我得到數據時,它是以指針的形式出現的。沒有辦法將指針封裝在std :: vector中。除非我找到辦法做到這一點,否則我不能使用標準庫。 – InsideLoop 2014-11-06 08:20:35

回答

3

既然C++ 11,您可能會使用特徵std::is_trivially_copyable

對於一個錯誤的情況下,可以這樣做:

namespace il 
{ 

template <typename T /*, typename Allocator*/> 
class vector 
{ 
    static_assert(std::is_trivially_copyable<T>::value, "type should be trivially copyable"); 

    /* Your implementation */ 
}; 

} 

要選擇不同的實現你可以使用std::conditional

template <typename T /*, typename A*/> 
using myvector = typename std::conditional<std::is_trivially_copyable<T>::value, 
     il::vector<T>, 
     std::vector<T> 
    >::type 
+0

我不知道'std :: conditional'。看起來像一個非常有用的工具。 – MatthiasB 2014-11-06 08:41:03

2

您可以將類型trait is_trivially_copyable與靜態聲明結合使用。

template<typename T> 
class IlVector { 
    static_assert(is_trivially_copyable<T>::value, 
       "Vector requires memcpy able type"); 
// ... 
}; 

int main() { 
    IlVector<int> a; 
    IlVector<double> b; 
    IlVector<std::array<int,3> > c; 
    IlVector<std::string> d; 
    // your code goes here 
    return 0; 
} 

如果你的類型不能被memcpy複製,這會給你一個編譯時錯誤。