Ho utilizzato il codice da "Is there a way to test whether a C++ class has a default constructor (other than compiler-provided type traits)?".Perché utilizzare due sizeofs per verificare se una classe è configurabile come predefinita, ma non è possibile?
ho modificato leggermente a lavorare con tutti i miei casi di test:
template< class T >
class is_default_constructible {
typedef int yes;
typedef char no;
// the second version does not work
#if 1
template<int x, int y> class is_equal {};
template<int x> class is_equal<x,x> { typedef void type; };
template< class U >
static yes sfinae(typename is_equal< sizeof U(), sizeof U() >::type *);
#else
template<int x> class is_okay { typedef void type; };
template< class U >
static yes sfinae(typename is_okay< sizeof U() >::type *);
#endif
template< class U >
static no sfinae(...);
public:
enum { value = sizeof(sfinae<T>(0)) == sizeof(yes) };
};
Perché funziona correttamente con la versione lite due template, ma non con quella normale (set #if 0
)? Si tratta di un bug del compilatore? Sto usando Visual Studio 2010.
ho usato le seguenti prove:
BOOST_STATIC_ASSERT(is_default_constructible<int>::value);
BOOST_STATIC_ASSERT(is_default_constructible<bool>::value);
BOOST_STATIC_ASSERT(is_default_constructible<std::string>::value);
BOOST_STATIC_ASSERT(!is_default_constructible<int[100]>::value);
BOOST_STATIC_ASSERT(is_default_constructible<const std::string>::value);
struct NotDefaultConstructible {
const int x;
NotDefaultConstructible(int a) : x(a) {}
};
BOOST_STATIC_ASSERT(!is_default_constructible<NotDefaultConstructible>::value);
struct DefaultConstructible {
const int x;
DefaultConstructible() : x(0) {}
};
BOOST_STATIC_ASSERT(is_default_constructible<DefaultConstructible>::value);
Sono davvero ad una perdita qui:
- due test non riescono con l'altra versione:
int[100]
eNotDefaultConstructible
. Tutti i test hanno esito positivo con la versione di due argomenti del modello. - Visual Studio 2010 non supporta
std::is_default_constructible
. Tuttavia, la mia domanda riguarda il motivo per cui c'è qualche differenza nelle due implementazioni e perché uno lavora e l'altro no.
Perché non verificare se hai già nella libreria standard [ 'std :: is_default_constructible'] (http://en.cppreference.com/w/cpp/types/is_default_constructible)? –
Che cosa non funziona? Funziona bene su g ++, tranne per 'BOOST_STATIC_ASSERT (! Is_default_constructible :: value);' –
@ BЈовић Se un assert non funziona, e che asserire è corretto, non funziona bene, sicuramente? – hvd