Vit*_*meo 2 c++ optional c++17
我有一个遗留的非阻塞dequeue API,如下所示:
template <typename T>
bool bad_queue<T>::try_dequeue(T* out);
    // Returns 'false' if there was nothing to dequeue.
    // Returns 'true' and sets '*out' to the dequeued item otherwise.
我想包装bad_queue<T>到我自己的成员函数中cool_queue<T>返回一个:std::optional<T>try_dequeue
template <typename T>
class cool_queue
{
private:
    bad_queue<T> _q;
public:
    std::optional<T> try_dequeue();
};
这是我目前实施的方式try_dequeue:
template <typename T>
std::optional<T> cool_queue<T>::try_dequeue()
{
    T temp;
    const auto ok = _q.try_dequeue(&temp);
    if(!ok) { return std::nullopt; }
    return {std::move(temp)};
} 
有没有办法避免临时temp缓冲区并直接构造_q.try_dequeue可选内部返回的值?例:
// PSEUDOCODE
template <typename T>
std::optional<T> cool_queue<T>::try_dequeue()
{
    std::optional<T> temp;
    const auto ok = _q.try_dequeue(&temp.storage());
    if(!ok) { return std::nullopt; }
    temp.assume_has_object();
    return temp;
} 
你无法在可选的via指针中构造值,但是遗留的api无论如何都不允许这样做.你可以改为默认 - 在optional中构造一个值并传递一个指针:
template <typename T>
std::optional<T> cool_queue<T>::try_dequeue()
{
    std::optional<T> temp;
    const auto ok = _q.try_dequeue(&temp.emplace());
    if (!ok) { temp.reset(); }
    return temp;
}