防止在模板中使用某些类型

时间:2014-11-06 08:04:56

标签: c++ c++11

我设计了自己的std :: vector实现,我称之为il :: vector。我想要:

  • 将其专门用于您可以使用memcpyintdoublestd::array<double, n>等进行复制的类型。)。
  • 对于无法使用memcpy复制的类型,例如std::vector,请使用其他类。在后一种情况下,如果我想要使用memcpy无法复制的内容进行实例化,我希望出现编译时错误,例如il::vector<std::vector<double>>

有办法吗?

PS:我总是得到如下答案:你应该使用std :: vector代替。我使用自己的库的主要原因是:

  • 我想使用指针来构造我的il :: vector而不复制数据
  • 我想使用ptrdiff_t作为数组索引而不是 stupid size_t。对数组索引使用无符号整数是STL最糟糕的想法之一。甚至Stroustrup也似乎反对它。
  • 我想使用我自己的分配器,这些分配器是为分配器设计的,而不是90年代设计用于不同目的的奇怪模型。

抱歉有点粗鲁,但我厌倦了:STL是上帝,甚至不说它不符合你的需要。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您可以将类型特征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复制,这将给你一个编译时错误。