是否可以知道该参数是否是默认的
Is it possible to know if the parameter was defaulted
注意:此问题仅限于 MSVS
我有这个函数签名:
void do_somthing(std::vector<foo>& bar={});
是否可以在函数的这两个调用之间有所不同:
第一:
do_something()
第二:
std::vector<foo> v;
do_something(v);
换句话说,我想要这样的东西:
void do_somthing(std::vector<foo>& bar={}){
if(/* bar was defaulted*/){
}
else{
}
}
编辑:实际代码:
template<class Tinput_iterator>
Tmodel perform_fitting(Tinput_iterator begin_data, Tinput_iterator end_data, std::vector<Tpoint>& inliers = {});
不,不是直接的。默认参数由调用站点的编译器替换,而不提供任何进一步的信息。
但是,有一个简单的解决方案可以实现您想要执行的操作:使用重载而不是默认参数。
namespace detail
{
void
do_something_impl(const std::vector<foo>& foos)
{
// Do things that always need to be done…
}
}
void
do_something()
{
// Do things specific to the no-argument case…
detail::do_something_impl({});
}
void
do_something(const std::vector<foo>& foos)
{
// Do things specific to the one-argument case…
detail::do_something_impl(foos);
}
如果您的逻辑要求您更频繁地分支(而不仅仅是在函数的开头或结尾),则可以将一个额外的布尔参数传递给detail::do_something_impl
,该参数对调用它的重载进行编码。
通常,我建议谨慎使用默认参数,并且更喜欢函数重载,因为它可以为您提供更好的控制,并且通常还可以提供更好的(不那么令人惊讶的)接口。
我有这个函数签名:
void do_somthing(std::vector<foo>& bar=std::vector<foo>{});
这不能编译,除非有危险的非标准编译器设置,你应该远离。
特别是,如果未指定/Za
,Visual C++ 允许这样做,但 /W4
仍会产生如下警告:
stackoverflow.cpp(6): warning C4239: nonstandard extension used: 'default argument': conversion from 'std::vector<foo,std::allocator<_Ty>>' to 'std::vector<foo,
std::allocator<_Ty>> &'
with
[
_Ty=foo
]
stackoverflow.cpp(6): note: A non-const reference may only be bound to an lvalue
void do_somthing(std::vector<foo>& bar=std::vector<foo>{}){ if(/* bar was defaulted*/){ } else{ } }
即使我们假设您实际上包含了使代码编译的缺失const
,答案也是:不,不可能知道bar
是否是默认的。
无论你打算在这里做什么,你都必须找到一个完全不同的解决方案。
函数的这两个调用之间是否可以有所不同?
不。 您可以检查向量是否为空,否则无法区分它们。
你可以做一些聪明的事情,比如传递一个转换的实用程序类,但这不是万无一失的,而且大多毫无意义,因为你可以更容易地制作两个不同的函数重载。
相关文章:
- C++14 及更高版本是否允许 Lambda 函数的默认参数?如果是这样,怎么办?
- 继承是否是将一组模型参数传递给不同类的可行解决方案
- 移动 l 值参考参数是否是一种不好的做法?
- 限制C++中允许的模板参数是否被认为是不良样式?
- 模板参数是否可以是引用类型?
- 检查传递给成员函数的参数是否是对象本身
- 如何检查模板参数是否是具有给定签名的可调用对象
- 模板参数是否可以无缝匹配类型和模板,也许是可变变量的一部分
- 使用 const CString& 而不是单独使用 CString 作为函数参数是否有任何性能优势?
- 在编译时检查模板参数是否是一种字符串
- 在声明中省略参数名称是否是一种好的做法
- 如何识别模板参数参数是否是模板内结构中另一个类的实例?C++
- 是否可以知道该参数是否是默认的
- std::函数的复制构造函数是否要求模板类型的参数类型是完整的类型
- 使用可变参数模板创建传递新对象的更安全方式是否是个好主意
- 如何检查模板参数是否是 2 的幂
- 有没有办法检测基元参数是否是可变大小的
- 检查模板参数是否为"true"可调用对象的正确方法是什么?
- 此错误消息是否正确:非类型模板参数不是常量表达式
- C++ 多态函数以 void * 和其他指针类型为参数:是否被认为是模棱两可的