In C++0x, I would like to determine if a class is trivial/has standard layout so I can use memcpy(), memset(), etc…
How should I implement the code below, using type_traits, so I can confirm that a type is trivial?
template< typename T >
bool isTrivialType()
{
bool isTrivial = ???
return isTrivial;
}
NOTE: is_pod() is too restrictive: I would like my class to have trivial constructors, etc… …for convenience.
Added: I think std::is_standard_layout<> may give me what I’m looking for.
1. If I add constructors, it still returns true
2. If I add a virtual method, it returns false
This is what I need to determine if I can use memcpy(), memset()
Edit: From Luc Danton’s explanation and link below (clarification):
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;
};
For memcpy() to be happy:
// N -> false
// T -> true
// SL -> ??? (if there are pointer members in destructor, we are in trouble)
// POD -> true
So it does look like is_trivial_class<> is correct: is_standard_layout<> is not necessarily right…
For
std::memcpyit is sufficient that the type be trivially copyable. From n3290, 3.9 Types [basic.types] paragraph 2:Following paragraphs also describe other useful properties of trivially copyables types (i.e. not just copying to a
chararray).std::is_trivially_copyableis the trait to detect just that. However as of my writing it’s not implemented by e.g. GCC, so you may want to usestd::is_trivialas a fallback (since in turn it requires a trivial copy constructor).I really do not recommend using
is_standard_layout, unless you really know what you’re doing (e.g. language interoperability on one particular platform) it’s not what you want. More information on what triviality and standard layout is about to perhaps help you specify the exact requirements you want.