[英]Why can't I use std::function as a std::set or std::unordered_set value type?
[英]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.