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);
}
我有一个函数 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);
}