POD / kkein POD erkennen

21/01/2014 - 10:59 von Heinz Saathoff | Report spam
Moin,

gibt es eine Möglichkeit, zur Übersetzungszeit in einem template zu
erkennen, ob der template-type ein einfacher POD ist oder eben nicht
und in Abhàngigkeit davon einen Compile-Error zu erzeugen?

Beispiel:
#include <string.h>
#include <string>

struct POD {
double x, y;
};

struct NOPOD {
double x, y;
std::string name;
};


template<typename T>
void Clear(T &obj) {
// wie erkennen, dass T ein POD ist?
memset(&obj, 0, sizeof(T));
}

int main(int argc, char *argv[]) {
POD p;
NOPOD np;

Clear(p);
Clear(np); // soll Fehler bringen!
}//main



- Heinz
 

Lesen sie die antworten

#1 Markus Schaaf
21/01/2014 - 12:09 | Warnen spam
Am 21.01.2014 10:59, schrieb Heinz Saathoff:

template<typename T>
void Clear(T &obj) {
// wie erkennen, dass T ein POD ist?
memset(&obj, 0, sizeof(T));
}

int main(int argc, char *argv[]) {
POD p;
NOPOD np;

Clear(p);
Clear(np); // soll Fehler bringen!
}//main



#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_pod.hpp>

template< class T >
typename boost::enable_if<
boost::is_pod< T >,
void



Clear( T &obj )
{
// ...
}

is_pod ist zwar im neuesten Standard, aber vermutlich funktioniert die
Boost-Variante davon etwas öfter. Übrigens sollte IIRC

obj = T();

dasselbe wie memset( ..., 0, ... ) machen. Falls das noch das macht, was
Du willst, könnte Folgendes für àltere Compiler funktionieren:

template< class T >
void Clear( T & obj, T const & null = T() )
{
obj = null;
}

Das klappt dann für alles mit Default-C'tor und Assignment.

MfG

Ähnliche fragen