我在这里看到了一些答案,但它们可能不适用于此。我有一个(成员)函数,主要用于一个参数(第一个):
const std::complex<double> Class::func(const std::complex<double> &x, \
std::vector<double> &y = 0, \
std::vector<double> &z = 0) const;
我希望y
和z
是可选的,甚至可能基于string
类型的第四个参数,类似这样:func( , , , const std::string &choice)
,但是让我只传递一个参数给函数,另外两个不被使用。例如,如果我传递y
,则必须在调用func()
之前完成其声明,对z
也一样,但我希望这是可选的,函数可以在数学方面有点沉重,如果不需要,就没有必要增加计算两个额外向量的负担。这可能吗?
答案 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;
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
}