Я собираюсь бросить вызов этому вопросу.Вы не должны хотеть короткого и элегантного решения этой проблемы.
Приведение на любом языке, включая C ++, в основном эквивалентно ругательству программиста: вы будете делать это иногда, потому что этолегко и без усилий, но не стоит.Это означает, что где-то ваш дизайн испортился.Возможно, вам нужно передать размер массива старому API, но старый API не использовал size_t
.Возможно, вы разработали кусок кода для использования float
, но в реальной реализации вы рассматриваете их как int
.
В любом случае, приведение используется для исправления ошибок, допущенных в других местах кода. Вам не нужно короткое и простое решение, чтобы решить эту проблему .Вы должны предпочесть что-то явное и утомительное по двум причинам:
- Это сигнализирует другим программистам, что приведение не является ошибкой: что-то преднамеренное и необходимое
- Чтобы заставить васменьше шансов сделать это;и вместо этого сосредоточиться на том, чтобы убедиться, что ваши типы соответствуют вашим ожиданиям, а не ожидаемому целевому API.
Итак, примите static_cast
, dynamic_cast
, const_cast
и reinterpret_cast
стиль написания вашего кода.Вместо того, чтобы пытаться найти способы облегчить приведение типов, найдите способы рефакторинга вашего кода, чтобы они были менее необходимы.
Если вы готовы все это игнорировать, то напишите что-то вродеэто:
template<typename T, typename U>
T as(U && u) {
return static_cast<T>(u);
}
int size = as<int>(values.size());
bool poly_type::operator==(base_type const& o) {
if(this == &o)
return true;
if(typeid(*this) == typeid(o)) {
return as<poly_type const&>(o).value == value;
} else {
return false;
}
}
Это, по крайней мере, уменьшит количество набираемого текста.