В C ++ 0x я хотел бы определить, является ли класс тривиальным / имеет ли класс стандартную структуру, поэтому Я могу использовать memcpy (), memset () и т. Д.
Как мне реализовать приведенный ниже код, используя type_traits, чтобы я мог подтвердить, что тип тривиален?
template< typename T >
bool isTrivialType()
{
bool isTrivial = ???
return isTrivial;
}
ПРИМЕЧАНИЕ: is_pod () слишком ограничивает : Я бы хотел, чтобы в моем классе были тривиальные конструкторы и т. Д. ... ... для удобства.
Добавлено: я думаю, что std :: is_standard_layout <> может дать мне то, что я ищу. 1. Если я добавлю конструкторы, он все равно вернет true 2. Если я добавлю виртуальный метод, он вернет false Это то, что мне нужно, чтобы определить, могу ли я использовать memcpy (), memset ()
Редактировать: Из объяснения Люка Дантона и ссылки ниже (пояснение):
struct N { // neither trivial nor standard-layout
int i;
int j;
virtual ~N();
};
struct T { // trivial but not standard-layout
int i;
private:
int j;
};
struct SL { // standard-layout but not trivial
int i;
int j;
~SL();
};
struct POD { // both trivial and standard-layout
int i;
int j;
};
Для того, чтобы memcpy () была счастлива:
// N -> false
// T -> true
// SL -> ??? (if there are pointer members in destructor, we are in trouble)
// POD -> true
Итак, похоже, что is_trivial_class <> правильный: is_standard_layout <> не обязательно правильный ...