Nehmen wir an, ich ein Makro wie dieses:static_cast <T> vs T (n) für Grundtypen
#define IS_SIGNED_B(T) (static_cast<T>(-1)<0)
Wäre es in Ordnung, es zu schreiben, wie
#define IS_SIGNED_B(T) (T(-1)<0)
Zu wissen, dass T (sollte) immer ein grundlegender Typ sein. Und verschiedene andere Fälle, wo ich einen bestimmten Wert brauche, um explizit von einem bestimmten Typ zu sein.
Ich weiß, diese Fragen für Situationen wie verursachen können:
signed char(0);
Aber zu wissen, dass ich Grundtypen haben typedef als:
typedef signed char Int8;
Int8(0);
es irgendwelche anderen Fragen, die nicht das? Kann der Konstruktor eines fundamentalen Typs als identisch mit einem statischen Cast betrachtet werden?
EDIT: Ich weiß über die Existenz von std::numeric_limits
und std::is_signed
. Dies war nur ein Beispiel. Nicht der tatsächliche Fall. Ich entschuldige mich, dass ich das nicht erwähnt habe.
Persönlich würde ich all dies vermeiden und uns ['std :: numeric_limits :: is_signed'] (http://en.cppreference.com/w/cpp/types/numeric_limits/is_signed) – NathanOliver
Warum brauchen Sie ein Makro dafür, wenn ['std :: is_signed'] (http://en.cppreference.com/w/cpp/types/is_signed) existiert? – Borgleader
Sie scheinen unter dem Eindruck zu stehen, dass 'T (-1)' den Konstruktor von 'T' für' T == int' aufruft, dies ist jedoch nur eine alternative Syntax für einen C-Style-Cast, der wahrscheinlich als implementiert ist 'static_cast', also sollte es keinen Unterschied geben. – nwp