В 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 ()
Edit: FromОбъяснение и ссылка Люка Дантона ниже (уточнение):
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 <>не обязательно прав ...