我设计了自己的std :: vector实现,我称之为il :: vector。我想要:
memcpy
(int
,double
,std::array<double, n>
等进行复制的类型。)。memcpy
复制的类型,例如std::vector
,请使用其他类。在后一种情况下,如果我想要使用memcpy
无法复制的内容进行实例化,我希望出现编译时错误,例如il::vector<std::vector<double>>
。有办法吗?
PS:我总是得到如下答案:你应该使用std :: vector代替。我使用自己的库的主要原因是:
抱歉有点粗鲁,但我厌倦了:STL是上帝,甚至不说它不符合你的需要。
答案 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复制,这将给你一个编译时错误。