2016-02-26 116 views
-1

注意:此问题仅限于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 = {}); 
+11

*两个*函数怎么样,一个是(正常,默认较少)参数,一个没有? – deviantfan

+3

它为什么重要? –

+0

@deviantfan确定这是一个正确的解决方案,它实际上是我计划要做的。但我很好奇,如果有可能做到这一点在相同的功能 –

回答

2

我有这样的函数签名:

void do_somthing(std::vector<foo>& bar=std::vector<foo>{}); 

无法编译,除非你应该远离危险非标准的编译器设置。

尤其的Visual C++允许这一点,如果没有指定/Za的,但/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是否被默认。

无论你打算在这里做什么,你必须找到一个完全不同的解决方案。

+0

好,我没有意识到这个参数是非''contst'。 – 5gon12eder

4

不,不是直接。缺省参数被编译器在呼叫站点取代,没有任何进一步的信息。

然而,有一个简单的解决方案,实现你想要做什么:使用重载的默认参数来代替。

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编码其中超载它是从调用。

一般情况下,我建议谨慎使用默认的参数和偏好函数重载因为它给你更好的控制,往往也比较好(那么令人惊讶。)接口。

2

这两个函数调用有可能不同吗?

号您可以检查,如果向量是空的,但在其他方面没有办法来区分它们。

你可以做聪明的事情,比如通过该转换工具类,但这不是防弹大多是毫无意义的,因为你可以更容易地做出两个不同的功能重载。

相关问题