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

时间:2016-09-08 12:39:34

标签: c++ vector default-arguments

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

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也一样,但我希望这是可选的,函数可以在数学方面有点沉重,如果不需要,就没有必要增加计算两个额外向量的负担。这可能吗?

3 个答案:

答案 0 :(得分:4)

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

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

我在这里违约了,但这是可选的......

答案 1 :(得分:1)

但是,如果使用std::vector,那么“空”vector是什么意思?这可以用作您需要的“可选”值。

关于原始代码的一些注释; “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

答案 2 :(得分:1)

引用不能是可选的,但有一些名为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
}