Это мой пример тестирования boost :: tribool:
#include <iostream>
#include "boost/logic/tribool.hpp"
int main()
{
boost::logic::tribool init;
//init = boost::logic::indeterminate;
init = true;
//init = false;
if (boost::logic::indeterminate(init))
{
std::cout << "indeterminate -> " << std::boolalpha << init << std::endl;
}
else if (init)
{
std::cout << "true -> " << std::boolalpha << init << std::endl;
}
else if (!init)
{
std::cout << "false -> " << std::boolalpha << init << std::endl;
}
bool safe = init.safe_bool(); <<---- error here
if (safe) std::cout << std::boolalpha << safe << std::endl;
return 0;
}
Я пытаюсь использовать функцию safe_bool () для преобразования boost :: tribool в обычный bool, но у меня ошибка времени компиляции:
Error 1 error C2274 : 'function-style cast' : illegal as right side of '.' operator D : \install\libs\boost\boost_samples\modules\tribool\src\main.cpp 23 1 tribool
Похоже, я использую функцию safe_bool () неправильно.
Не могли бы вы помочь мне решить эту проблему? Благодарю.
safe_bool
является типом, то есть функцией operator safe_bool()
преобразует tribool
к safe_bool
, Если вы просто, что преобразовать в обычный bool
использовать: bool safe = init;
, safe
будет в этом случае true
если и только если init.value == boost::logic::tribool::true_value
,
Тот safe_bool
«Метод» это не обычный метод, но оператор преобразования.
BOOST_CONSTEXPR operator safe_bool() const noexcept;
// ^^^^^^^^
Оператор преобразования означает tribool
будет действовать как bool
когда запрашивается логическое значение, так что вам просто нужно написать:
bool safe = init; // no need to call anything, just let the conversion happen.
// or just:
if (init) { ... }
Вы должны заметить, что оператор возвращает safe_bool
не bool
, safe_bool
вот фактически внутренний тип указателя на функцию-член:
class tribool
{
private:
/// INTERNAL ONLY
struct dummy {
void nonnull() {};
};
typedef void (dummy::*safe_bool)();
Это написано следующим образом безопасная идиома (который устарел в C ++ 11).
Важно то, что указатель ненулевой, когда tribool
верно, и ноль, когда tribool
является ложным или неопределенным, поэтому мы можем рассматривать результат как логическое значение.