C ++: как мне использовать type_traits, чтобы определить, является ли класс тривиальным?

В 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 <> не обязательно правильный ...

8
задан kfmfe04 2 October 2011 в 08:51
поделиться