繁体   English   中英

在C ++中处理可选参数/默认值的最佳方法

[英]Best way to approach optional parameters/default value in C++

我想知道是否有办法做以下的事情,都有一个功能:

    template <typename T>
void _class_<T>::func (T chgx = x, T chg y = y, T chgz = z)
{
     x = chgx;
     y = chgy;
     z = chgz;
}

我要做的是将默认值设置为我想要更改的值,这样如果我省略一些参数,那些值就不会改变。 上面的代码不起作用,我想我理解为什么(该函数实际上不能访问这些值,因此它会抛出错误)。

我想知道的是,如果有办法像我上面描述的那样,都有一个功能。 我唯一的选择是使用多个定义重载函数来处理不同数量的参数?

您可以通过一组重载函数来完成您想要的任务。

// First overload. Needs all arguments.
template <typename T>
void _class_<T>::func (T chgx, T chgy, T chgz)
{
     x = chgx;
     y = chgy;
     z = chgz;
}

// Second overload. Needs two arguments.
template <typename T>
void _class_<T>::func (T chgx, T chgy)
{
     x = chgx;
     y = chgy;
}

// Third overload. Needs one argument.
template <typename T>
void _class_<T>::func (T chgx)
{
     x = chgx;
}

// You can have a fourth overload that takes no arguments.
// However, it's totally useless.
template <typename T>
void _class_<T>::func ()
{
   // Nothing needs to be changed.
}

重复代码较少的东西(感谢@BenVoigt提供的建议):

// Second overload. Needs two arguments.
template <typename T>
void _class_<T>::func (T chgx, T chgy)
{
   func(chgx, chgy, z);
}

// Third overload. Needs one argument.
template <typename T>
void _class_<T>::func (T chgx)
{
   func(chgx, y);
}

// You can have a fourth overload that takes no arguments.
// However, it's totally useless.
template <typename T>
void _class_<T>::func ()
{
   func(x);
}

一种方法是使用boost::optional ,这是一个小包装器,如果没有给它参数,则默认为空:

using boost::optional;

template<typename T>
void _class_<T>::func( optional<T> cx = {}, 
     optional<T> cy = {}, optional<T> cz = {} )
{
    if ( cx ) x = *cx;
    if ( cy ) y = *cy;
    if ( cz ) z = *cz;
}

虽然你没有动作或引用语义这样做(所以我仍然喜欢R Sahu的解决方案)

一种方式(同样,它不支持移动或引用语义)是使函数通过初始化列表获取变量参数:

template<typename T>
void _class_<T>::func( std::initializer_list<T> items )
{
    T const *ptr = items.begin();

    if ( ptr != items.end() ) x = *ptr++;
    if ( ptr != items.end() ) y = *ptr++;
    if ( ptr != items.end() ) z = *ptr++;
}

用法:

obj.func({ 1, 2, 3 });
obj.func({ 1 });
obj.func({});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM