Небезопасно, `noexcept` и без переднего пути доступа к` std :: variant`C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Небезопасно, `noexcept` и без переднего пути доступа к` std :: variant`

Сообщение Anonymous »

Код: Выделить всё

std::variant< /code> предоставляет следующие функции доступа: < /p>

[list]
[*] std::get_if
: перенести pointer в вариант , вернуть pointer на альтернативу. < /p>

Код: Выделить всё

template 
auto* std::get_if(std::variant* pv) noexcept;
< /code>


 
Если pv < /code> не является нулевым указателем, а pv-> index () == i < /code>, возвращает указатель на значение, хранящееся в варианте, указанном на pv < /code>. В противном случае возвращает значение нуля.template 
auto* std::get_if(std::variant* pv) noexcept
{
if(pv == nullptr) return nullptr;
if(pv->index() != I) return nullptr;
return &(pv->real_get());
}
[/list]
[*]

Код: Выделить всё

std::get
: перенести reference на вариант , return reference на альтернативу, на недопустимый доступ.

Код: Выделить всё

template 
auto& std::get(std::variant& v);
< /code>


 
if v.index () == i < /code>, возвращает ссылку на значение, хранящееся в v < /code>. В противном случае, бросает std :: bad_variant_access < /code>. < /P>
< /blockquote>

Это означает, что реализация Get < /code> примерно выглядит так: < /p>

template 
auto& std::get(std::variant& v)
{
if(v.index() != I) throw std::bad_variant_access{};
return v.real_get();
}
< /code> < /li>
< /ul> < /li>
< /ul>



[b] Я хочу небезопасную функцию доступа: < /strong> < /p>


     < /p>. />   принимает  reference  к варианту 
, избегая какого -либо pv == nullptr проверить.
имеет undefined birth if v.index ()! = I . Потому что могут быть некоторые ситуации, когда я на 100% уверен, что конкретный вариант экземпляр содержит определенный тип в пути кода. Кроме того, было бы полезно при написании общего кода, который уже отдельно проверял v.index ()! = I (например, написание моего собственного посещения ) .

Пример реализация:

Код: Выделить всё

template 
auto& unsafe_get(std::variant& v)
{
return v.real_get();
}
< /code>

 есть ли что -то подобное в стандарте? < /strong> я не смог его найти. Если нет, то может ли это реализовать для std :: variant 
, или мне нужно развернуть свой собственный вариант реализацию? [/b]

Подробнее здесь: https://stackoverflow.com/questions/420 ... stdvariant
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Можно ли проверить концепцию на соответствие std::variant и std::vector?
    Anonymous » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Можно ли проверить концепцию на соответствие std::variant и std::vector?
    Anonymous » » в форуме C++
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Можно ли проверить концепцию на соответствие std::variant и std::vector?
    Anonymous » » в форуме C++
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Преобразовать std :: variant в std :: variant
    Anonymous » » в форуме C++
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Преобразование std::variant в другой std::variant с супернабором типов.
    Anonymous » » в форуме C++
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»