Повысить использование трибунов

Это мой пример тестирования 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 () неправильно.
Не могли бы вы помочь мне решить эту проблему? Благодарю.

2

Решение

safe_bool является типом, то есть функцией operator safe_bool() преобразует tribool к safe_bool, Если вы просто, что преобразовать в обычный bool использовать: bool safe = init;, safe будет в этом случае true если и только если init.value == boost::logic::tribool::true_value,

3

Другие решения

Тот 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 является ложным или неопределенным, поэтому мы можем рассматривать результат как логическое значение.

2

По вопросам рекламы [email protected]