2016-02-26 126 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

這兩個函數調用有可能不同嗎?

號您可以檢查,如果向量是空的,但在其他方面沒有辦法來區分它們。

你可以做聰明的事情,比如通過該轉換工具類,但這不是防彈大多是毫無意義的,因爲你可以更容易地做出兩個不同的功能重載。

相關問題