GMan опубликовал код для Delicious auto_cast
«оператора» , который позволяет писать такой код на C ++ :
float f = 4.0f;
int i = auto_cast(f);
// instead of:
int j = static_cast(f);
или, что более важно,
T x = value;
typename nested_type::type y = auto_cast(x);
// instead of
typedef typename nested_type::type my_type;
my_type z = static_cast(x);
В принципе, этот оператор отлично справляется с удалением ненужной избыточности из static_cast
, и в то же время остается безопасным . Это даже безопаснее, чем static_cast
, поскольку предотвращает случайное несовпадение типов:
int i = 1234;
short s = static_cast(i); // s == -46, not 1234!
Однако j_random_hacker обнаружил недостаток в операторе:
static_cast разрешает понижающие, которые потенциально небезопасны.
Действительно, auto_cast
, вероятно, должен запрещать понижающие передачи, потому что они могут не работать:
class base { };
class derived : public base { };
base b;
derived* pd = auto_cast(&b); // should fail at compile time.
Отсюда мой вопрос:
Вероятно, это будет связано с enable_if
. Меня особенно интересует решение, которое позволяет компилятору предоставлять хорошую диагностику в случае сбоя (= читаемые сообщения об ошибках).