2009-07-20 24 views
17

這就是問題所在。是否像C++中的C#參數?

+1

能否請您介紹一下C++你的男人用什麼「C#PARAMS」的程序員? – 2009-07-20 21:20:12

+0

@ JohannesSchaub - litb它的[PARAMS](https://msdn.microsoft.com/en-us/library/w5zay9db.aspx)關鍵字 – jxramos 2016-04-28 02:30:58

回答

16

對於非託管C++使用相同的方便的語法,沒有。

但對於variable argument lists支持在C++函數。

基本上你聲明瞭一個函數,最後一個參數是一個省略號(...),並且在函數體內使用va_start()/ va_arg()調用來解析出提供的參數列表。

這種機制不是類型安全的,並且調用者可以傳遞任何東西,所以你應該清楚地記錄功能的公共接口,你希望在傳遞什麼。

對於託管C++代碼,看到裏德的評論。

19

是的。在標準C++中,可以使用va_arg和...語法。請參閱MSDN for details

對於C++/CLI,這位的快捷方式。

你這樣做的:

void TheMethod(String^ firstArgument, ... array<Object^>^ variableArgs); 

看到這個blog post for details

+0

很高興知道這個問題......不知道C++有這個擴展託管代碼。 – LBushkin 2009-07-20 20:12:15

+0

@LBushkin:更新爲更好的語法。 – 2009-07-20 20:13:44

0

有升壓一個named parameters庫(如果我理解C#正確什麼是PARAMS)。它允許寫這樣的功能:

int y = lib::f(_name = "bob", _index = 2); 

不能告訴任何關於是否涉及重大開銷。

3

如今,隨着現代C++中,可以使用可變參數功能的現代類型安全的做法。

要麼使用可變參數模板或std :: initializer_list如果所有的參數具有相同類型的

隨着可變參數模板,您可以使用遞歸經過一個可變參數的參數列表。可變參數模板例如:

template<class T> 
void MyFoo(T arg) 
{ 
    DoSomething(arg); 
} 
template<class T, class... R> 
void MyFoo(T arg, R... rest) 
{ 
    DoSomething(arg); 
    // If "rest" only has one argument, it will call the above function 
    // Otherwise, it will call this function again, with the first argument 
    // from "rest" becoming "arg" 
    MyFoo(rest...); 
} 

int main() 
{ 
    MyFoo(2, 5.f, 'a'); 
} 

這保證如果DoSomething的,或任何其他代碼,然後遞歸調用MyFoo運行之前,已經爲你傳遞給函數MyFoo每個參數的類型的過載,即確切的超載現象打電話。

性病:: initializer_list,您可以使用一個簡單的foreach循環都要經過論證

template<class T> 
void MyFoo(std::initializer_list<T> args) 
{ 
    for(auto&& arg : args) 
    { 
     DoSomething(arg); 
    } 
} 
int main() 
{ 
    MyFoo({2, 4, 5, 8, 1, 0}); // All the arguments have to have the same type 
} 
相關問題