Как предотвратить неявное преобразование строки в 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
}

https://godbolt.org/z/3678j5

→ Ссылка