函数的 C++ 可选 std::vector 参数

C++ Optional std::vector argument for function

我在这里看到了一些答案,但它们可能不适用于此处。我有一个(成员)函数,主要用于只有一个参数(第一个):

const std::complex<double> Class::func(const std::complex<double> &x, \
                                       std::vector<double> &y = 0, \
                                       std::vector<double> &z = 0) const;

我希望 yz 是可选的,甚至可能基于 string 类型的第四个参数,像这样:func( , , , const std::string &choice),但是这将让我只将一个参数传递给函数,而其他两个不被使用。例如,如果我确实传递 y,它的声明必须在调用 func() 之前完成,z 也是如此,但我希望这是可选的,函数可以在数学方面有点繁重,如果不需要,则无需增加计算两个额外向量的负担。这可能吗?

使用指针并传递一个 nullptr,检查这个..

const std::complex<double> Class::func(const std::complex<double> &x, \
                                       std::vector<double> *y = nullptr, \
                                       std::vector<double> *z = nullptr) const;

我在这里默认了它们,但这是可选的...

然而,鉴于 std::vector 的使用,"empty" vector 是什么意思?这可以用作您需要的 "optional" 值。

原代码的一些注释; "null" 引用无效,即 std::vector<double> &y = 0 无法编译。可以在该位置使用指针,这不会立即意味着需要分配。

const std::complex<double> Class::func(
    const std::complex<double> &x,
    std::vector<double>* y = nullptr,
    std::vector<double>* z = nullptr) const;

函数重载通常是解决这种情况的方法;函数的内部结构被推迟到每个最终实现...

const std::complex<double> Class::func(
    const std::complex<double> &x) const;
const std::complex<double> Class::func(
    const std::complex<double> &x,
    std::vector<double>& y) const;
const std::complex<double> Class::func(
    const std::complex<double> &x,
    std::vector<double>& y,
    std::vector<double>& z) const;

还有std::optional.

const std::complex<double> Class::func(
    const std::complex<double> &x,
    std::optional<std::vector<double>> &y,
    std::optional<std::vector<double>> &z) const;

如果您的标准库中没有,还有 boost::optional

引用不能是可选的,但有一个叫做 boost::optional<>

的东西

如果您担心复制操作,您应该改用指针并默认使用 nullptr

如果你还想让它在最后依赖于一个字符串,你可以编写一个包装函数

只需添加另一个功能:

const std::complex<double> Class::func(
    const std::complex<double> &x,
    std::string str,
    std::vector<double> *y = nullptr,
    std::vector<double> *z = nullptr) const
{
    if(str == ...)
        return func(....);
    else
       return func(....); //different call
}