2016-10-17 2 views
0

std::optional a la méthodevalue_if - l'inverse de value_or ou pour std :: optionnel?

template< class U > constexpr T value_or(U&& default_value) const&; 

et pourtant, il n'a pas le constructeur

template< class U > optional(bool condition, const U& value); 

qui suinte comme la chose en face. Sinon, vous pouvez vous attendre à avoir la méthode/named langage constructeur statique:

constexpr std::optional<T> value_if(bool condition, const T& value) { 
    return condition ? nullopt : std::optional(value); 
} 

Mes questions:

  1. Y at-il un problème conceptuel avec un value_if (dans l'une des variantes I listed)?
  2. Est-ce que quelque chose comme ça était proposé dans la norme?

Remarque: Je ne savais pas si j'avais const T& value ou const T&& value.

Répondre

2

Y a-t-il un problème conceptuel avec un value_if (dans l'une ou l'autre des variantes listées)?

Oui. Vous devez créer un objet T en direct, même si votre condition crée un nullopt. Alors que faire auto t = cond ? optional<T>(expr) : nullopt; inline évaluera seulement expr si cond est true.

Par exemple:

auto optStr1 = value_if(cond, get_object(...)); //Will *always* evaluate get_object 
auto optStr2 = cond ? optional(get_object(...)) : nullopt; //Will only evaluate get_object if `cond` is true 

était quelque chose comme celui proposé d'entrer dans la norme?

No.

+0

Je ne suis pas sûr que je comprends. À quel moment un objet T vivant sera-t-il créé, si je passe par référence? Je veux dire, il y a l'argument initial que je passe à 'value_if', qui est un objet existant auquel je passe une référence; et il y a la construction dans la troisième clause de l'opérateur trinaire - mais c'est une logique à court terme, donc ça ne s'appelle pas vraiment. Ou est-ce que je manque quelque chose? – einpoklum

+0

@einpoklum: Voir les exemples ajoutés. –

+0

Ah, mais c'est exactement la même chose que 'my_optional.value_or (get_object (...))', qui pourrait être remplacé par 'auto v = my_optional? my_optional.value: v {} '; – einpoklum