передача boost :: необязательное lvalue как ссылка на функцию

Вы можете как-нибудь передать boost::optional lvalue как ссылка на функцию, которая изменяет значение? Что-то вроде этого (http://coliru.stacked-crooked.com/a/f77d3b095af3d66b):

#include <iostream>

#include <boost/optional.hpp>

void foo(int& x)
{
x = 3;
}

int main() {
boost::optional<int> y;
foo(*y);
std::cout << *y << std::endl;
}

что не работает, что неудивительно.

Функция должна использовать стандартный тип в качестве выходного аргумента tho (например, int& x). Я надеюсь, что объясняю это правильно. Я спрашиваю об общей возможности моего намерения.

1

Решение

Да. вам просто нужно инициализировать optional как ваша ошибка компиляции предполагает:

boost :: option :: reference_type boost :: option :: get () [with T = int; boost :: необязательный :: reference_type = int&]: Утверждение `this-> is_initialized () ‘не удалось.

Это работает & печать 3:

#include <iostream>
#include <boost/optional.hpp>

void foo(int& x)
{
x = 3;
}

int main() {
boost::optional<int> y = 2;
foo(*y);
std::cout << *y << std::endl;
}

Важное замечание, отмеченное операцией, заключается в том, что даже если значение инициализации неизвестно во время компиляции, boost в любом случае подтвердит состояние дополнительного элемента (включено operator* или на get()), что означает, что если необязательный параметр не установлен (boost::none) приложение потерпит крах.

Таким образом, можно либо инициализировать необязательным, содержащим действительное значение (не boost::none) или пройти optional<int>&,

2

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

Вы хотите быть очень осторожным здесь. Если вы поменяете местами boost :: option для std :: option, тогда std :: option не защитит вас с помощью компилятора. Посмотрите, что с станд :: опционально я не инициализировал. Нет ошибки компилятора. Мне разрешено писать в опциональное, но опциональное не считается инициализированным, т.е. (bool) y == ложь

#include <iostream>
#include <boost/optional.hpp>
#include <boost/optional/optional_io.hpp>
#include <optional>

void foo(int& x)
{
x = 3;
}

int main() {
{
boost::optional<int> y = 2;
foo(*y);
std::cout << *y << " " << !!y << std::endl;
}

{
std::optional<int> y;
foo(*y);
std::cout << *y << " " << !!y << std::endl;
}
}

вывод

3 1
3 0

http://coliru.stacked-crooked.com/a/a169e7c43052a206

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector