c++ 将对象作为函数参数传递给需要 std::optional 的函数

c++ passing an object as function parameter to a function expecting an std::optional

我有一个函数 func(std::optional<A>& a),我想使用 A 的实例来调用它,就像下面的代码:

#include <optional>
#include <iostream>

class A
{
public:
    explicit A(int a) : m_a(a)
    {}

    ~A() = default;

    int get() { return m_a; }

    A(const A&) = delete;
    A(A&&) = delete;
    A& operator=(const A&) = delete;
    A& operator=(A&&) = delete;

private:
    int m_a;
};

void func(std::optional<A>& a)
{
    if (a.has_value()) {
        std::cout << a->get() << std::endl;
    } else {
        std::cout << "no value" << std::endl;
    }
}

int main() {
    A a(5);
    func(a);
}

如您所见,A 不允许任何复制或移动运算符。当我 运行 这段代码时,我得到

<source>:34:10: error: invalid initialization of reference of type 'std::optional<A>&' from 
expression of type 'A'

我的问题是如何将 a 传递给 func() 并使 std::optional 引用我的对象?

如果那不可能,我仍然希望有一种方法可以将 a 传递给 func() 而不是使用 c 风格的指针(例如 func(A* a)

如果另一层间接寻址不是问题,您可以使用 std::optional<std::reference_wrapper<A>> :

#include <functional>

//.... 

void func(const std::optional<std::reference_wrapper<A>>& a)
{
    if (a.has_value()) {
        std::cout << a->get().get() << std::endl;
    } else {
        std::cout << "no value" << std::endl;
    }
}

int main() {
    A a(5);
    func(std::ref(a));
}

(我想缺少的 const 是一个拼写错误,因为即使 A 可以移动或复制,它在您的示例中也是一个错误)。

请注意,这确实满足您的要求:传递 std::optional 并且不使用原始指针。但是,使用引用(而不是指针)有点奇怪,因为它不能为空,然后将其包装到可选中以允许“空”值。使用原始指针似乎是最简单直接的解决方案。

请注意原始指针不是“c 风格”。可以被认为是 c 风格并且应该无论如何避免的是原始拥有指针。当您想将参数传递给函数时,该函数不影响所有权,并且它可以有值也可以没有值,那么原始指针就可以了。就这样

void func(A* a)
{
    if (a) {
        std::cout << a->get() << std::endl;
    } else {
        std::cout << "no value" << std::endl;
    }
}

int main() {
    A a(5);
    func(&a);
}