c++ - Type trait to identify types that can be read/written in binary form -
is there type trait (or concept) identify types following safe?
template <typename t> std::enable_if_t<std::some_type_trait<t>::value> write(std::ostream &os,const t &x) { os.write(reinterpret_cast<const char *>(&x),sizeof(t)); } template <typename t> std::enable_if_t<std::some_type_trait<t>::value> read(std::istream &is,t &x) { is.read(reinterpret_cast<char *>(&x),sizeof(t)); }
i’m thinking of classes containing pod excluding pointers (but not arrays). standardlayouttype
s without pointers. neither want constrain objects trivialtype
nor triviallycopyable
.
sorry if i’m inaccurate. know little of data representation.
given 1st parameter of s
, read
method:
extracts characters , stores them successive locations of character array first element pointed
s
so real question is: if have initialized object writing string of bytes it's address, valid?
this concept of value representation. , value representation of trivially copyable types such that:
copying bytes occupied object in storage sufficient produce object same value
thus want ensure object trivially copyable isn't per standard concept can succinctly defined as:
- every copy constructor trivial or deleted
- every move constructor trivial or deleted
- every copy assignment operator trivial or deleted
- every move assignment operator trivial or deleted
- at least 1 copy constructor, move constructor, copy assignment operator, or move assignment operator non-deleted
- trivial non-deleted destructor
the spirit of assertion @ least 1 trivial initializer exists object boils down these requirements of trivially copyable type, it's non-static members, , of it's base classes:
- it's given trivial initializer is, or behaves as, corresponding default intializer
- it has no virtual methods
- it has no members of volatile-qualified type
as far requirement of trivial destructor:
- the destructor not user-provided (meaning, either implicitly declared, or explicitly defined defaulted on first declaration)
- the destructor not virtual (that is, base class destructor not virtual)
- all direct base classes have trivial destructors
- all non-static data members of class type (or array of class type) have trivial destructors
having defined means trivially copyable type, impossible "type trait or concept" determine whether of these requirements met in cases, example: type defines trivial initializer signature matches default initializer may or may not trivially copyable contingent on code initializes type in initializers body; such type, way determine if it's trivially copyable human inspection of initializer. if willing tighten requirements is detectable, is_trivially_copyable
guarantee type trivially copyable.
Comments
Post a Comment