繁体   English   中英

我可以使用std :: set <std::string> 作为功​​能的默认参数?

[英]Can I use std::set<std::string> as a default parameter for a function?

我是新手,现在确定这是否可行。 我想向函数添加std::set<std::string>的参数,并将其默认值设置为NULL ,以避免对以前的使用产生影响。

所以基本上

func(int a); turns into  
func(int a, std::set<std::string> & temp = NULL);

但这会给我一个错误"error C2440: 'default argument' : cannot convert from 'int' to 'std::set<_Kty> &'"

有人可以帮我吗?

谢谢

为了将默认值设置为NULL ,您必须传递一个std::set<std::string>* ,而不是对值类型的引用。

此外,如果您要传递一个非指针类型,并且您想分配所有默认值 ,则它必须是const引用,因为否则您将无法(建议!)为其分配一个临时值。

因此,您对“默认”值的选择基本上是:

std::set<std::string>* = NULL

要么:

const std::set<std::string>& = std::set<std::string>()

或选项3,直接使用函数重载:

void myfunction() {dothing(0);}
void myfunction(std::set<std::string>& optional_param) 
{ dothing(optional_param.size()); }

或选项4,具有指示参数是否为“设置”的相应bool值:

void myfunction(std::set<std::string>& param, bool param_has_meaning=true) {}

看来您已经在寻找第三个选项。 您只需要编写两个定义,一个带有参数,一个不带参数。

在C ++中不能有NULL 引用

最简单的方法是set一个虚拟的空set

std::set<std::string> empty;
void func(int a, std::set<std::string>& temp = empty)
{
    // ...
}

然后,您可以致电:

    func(1);

Neater仍然会使用函数重载来创建包装器,这样您就无需默认:

void func(int a, std::set<std::string>& temp)
{
}

void func(int a)
{
    std::set<std::string> empty;
    func(a, empty);
}

    // And then...
    func(1);

所有这些假设都假设,如果您传入set ,则将以某种方式对其进行修改。 从您的问题尚不清楚您的意图是什么,但是我已经基于您的引用是非const进行了假设。 如果我计算错了,那么答案就更简单了:

void func(int a, const std::set<std::string>& temp = std::set<std::string>())
{
}

您有正确的想法-使用参考。 但是,默认情况下,引用不能像指针一样为NULL。 因此,您可能想做的是对该函数进行重载,以便在不想将集合作为参数传递时使用void func(int a)并使用void func( int a, std::set<std::string>& temp)

这样,您实际上可以提供两个单独的实现-一个可以在一个集合上工作,而另一个不能。 从使用角度来看,它的作用与默认参数相同。 从编码的角度来看,每个实现都有一个更明确的目的。

如果您不打算修改集合,我建议使用const引用代替:

void func( int a, const std::set<std::string>& temp )

下面将为您提供一个空的set对象:

std::set<std::string>()

暂无
暂无

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

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