Если у меня есть код, например
class CString { int GetLength(); };
bool smaller(CString s1, std::string s2) {
return s2.size() > s1.GetLength();
}
Что мне лучше делать?
-
Измените
s1.GetLength()
на(size_t)c.GetLength()
?
Это поможет избавиться от предупреждения компилятора относительно "несоответствия без подписей" и сообщить о моем намерении бросить, и это самый простой способ. Но он, вероятно, нахмурился.: ( -
Измените
s1.GetLength()
наstatic_cast<size_t>(c.GetLength())
?
Это поможет избавиться от предупреждения с помощью "The Correct". -
Измените
s1.GetLength()
наstatic_cast<std::string::size_type>(c.GetLength())
?
Это чрезвычайно многословное... есть ли практическая польза для этой абстракции, или я должен ее нарушить? -
Оставьте это как есть?
Это поможет сделать компилятор переполнением с помощью переключателя/RTCc
(моя главная проблема здесь), за счет предупреждения. -
Сделайте что-нибудь еще?
Должен ли я сделать свою собственную функцию кастинга? Использовать макрос? Должен ли я проверять время выполнения и время компиляции? Любые другие идеи?
Edit:
Кажется, что пример берется слишком буквально...
Я, очевидно, не хотел говорить примерно CString::GetLength()
. Этот конкретный метод, конечно, не вызывает большого беспокойства.:) То, что меня беспокоит, - это более общий случай, когда я получаю целое число, которое никогда не должно быть отрицательным, но которое теоретически может быть связано с ошибками.
Черт, я могу написать метод, который делает это, чтобы переопределить другой кусок кода, поэтому я не могу изменить подпись. И у моего кода наверняка были бы ошибки, хотя я бы этого не ожидал.
В таком случае, что мне делать?