2014-11-06 64 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复制,这会给你一个编译时错误。