Давайте предположим, что у меня есть макрос так:static_cast <T> против Т (п) для основных типов
#define IS_SIGNED_B(T) (static_cast<T>(-1)<0)
было бы хорошо, чтобы написать его как
#define IS_SIGNED_B(T) (T(-1)<0)
Зная, что Т (должен) всегда будет фундаментальным типом. И различные другие случаи, когда мне нужно определенное значение, чтобы быть явно определенного типа.
Я знаю, что это может вызвать проблемы в ситуациях, таких как:
signed char(0);
Но, зная, что я основные типы typedef'ed как:
typedef signed char Int8;
Int8(0);
Существуют ли какие-либо другие вопросы, другие, чем это? Может ли конструктор фундаментального типа считаться идентичным статическому литье?
EDIT: Я знаю о существовании std::numeric_limits
и std::is_signed
. Это был просто пример. Не настоящий случай. Приношу свои извинения за то, что не упоминал об этом.
Лично я бы обошел все это и нас ['std :: numeric_limits :: is_signed'] (http://en.cppreference.com/w/cpp/types/numeric_limits/is_signed) – NathanOliver
Зачем вам нужен макрос для этого, когда существует ['std :: is_signed'] (http://en.cppreference.com/w/cpp/types/is_signed)? – Borgleader
У вас, похоже, создается впечатление, что 'T (-1)' вызывает конструктор 'T' для' T == int', однако это просто альтернативный синтаксис для c-стиля, который, вероятно, реализован как 'static_cast', поэтому не должно быть разницы. – nwp