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