Как предотвратить неявное преобразование строки в bool
Функция, принимающая булево значение:
void foo(bool b) {
if (b)
std::cout << "true\n";
else
std::cout << "false\n";
}
вызывается (по ошибке) как:
foo("false");
и выводит "true", т.к. при вызове строка "false" неявно преобразовывается в bool со значением true. Можно ли как-то ограничить возможность вызова функции foo(bool) с отличным от bool параметром.
В действии: https://wandbox.org/permlink/25Zv09CM9jyAZcjG
Ответы (1 шт):
Автор решения: user7860670
→ Ссылка
Можно сделать эту функцию шаблоном или добавить запрещенные перегрузки для типов, которые могут быть неявно преобразованы в bool:
#include <iostream>
template< typename x_MustBeBool >
void foo(x_MustBeBool) = delete;
template<>
void foo< bool >(bool b) {
if (b)
std::cout << "true\n";
else
std::cout << "false\n";
}
int main()
{
foo(true); // OK
foo("false"); // Error
}