2009-08-31 44 views
2

我不知道我知道該怎麼問這個。按位置引用函數的參數?

說我有一個功能

void myFunc (int8 foo, float bar, int whatever) 
{ 
... 
} 

有引用它的位置的特定參數的快捷方式?

void myFunc (float foo, float bar, float whatever) 
{ 
    float f; 
    f = ARG[1]; // f now equals bar 
} 

爲什麼會這樣?

追問:

謝謝您的回答鄉親。我想我錯了。我覺得很奇怪的是,C++不允許這個,Perl和一些僞語言(我特別想到的AutoIt)做的。至於「爲什麼」?只是使用一個簡單的循環來通過它們。我承認,有更好的方法在正常情況下,實現這一萬千,但我是想我darndest不修改我的小世界以外的其他人的代碼。換句話說,我無法控制調用代碼。它將投入甩在我的喉嚨上,我必須儘可能地管理它們。所以我不能在調用我的函數之前循環。無論如何,這顯然是一團糟,並沒有那麼多的變量,所以我只是重複了代碼。沒有比較大的。感謝您的意見和有趣的建議。

+1

'new'不是有效的變量名,順便說一句。 – GManNickG

+4

沒有,因爲一般來說沒有理由這麼做。如果你想解釋爲什麼你認爲你需要,我們可以提出替代方案。 – moonshadow

+0

爲什麼不只浮點temp = bar;? – ThePosey

回答

2

如果真的好像你需要的是同一類型的,而不是明確指定的參數值的參數數組,那麼你可以傳遞一個數組作爲參數。

void myFunc (float foo[3]) 
{ 
    float bar; 
    bar = foo[1]; 
} 

這可能是低效的,如果你的陣列是更長的時間,所以一個更好的解決辦法是使用const引用這樣的:

void myFunc (const float & foo[3]) 
{ 
    float bar; 
    bar = foo[1]; 
} 

或者像許多C++在這個網站,最好的問題解決方法是使用一個std :: vector的

void myFunc (const std::vector<float> & foo) 
{ 
    float bar; 
    bar = foo[1]; 
} 
1

沒有沒有這樣做一個符合標準的方式。

3

不在C或C++,沒有。

隨着月影建議:你想解決什麼實際問題?

(如果你想添加的說明,請編輯您的問題,而不是留在這個答案評論 - 更多的人會看到你的編輯這樣)

1

嘗試<cstdarg>頭。

請記住,你不會得到的參數索引訪問,但你可以寫一個循環,並呼籲va_arg,直到你達到你想要的參數。確定參數的數據類型將成爲您的下一個問題。

2

可以使用C風格的變量參數:

#include <stdarg.h> 

void myFunc (int8 foo, ...) 
{ 
    va_list args; 
    va_start(args, foo); 

    float bar = va_arg(args, float); 
    int whatever = va_arg(args, int); 

    va_end(args); 
} 

但是這也意味着:

  1. 你需要知道的,事先,將要使用的 參數來調用 的功能。
  2. 你並沒有靜態類型檢查的任何 好處。
+0

在C++中,幾乎沒有任何理由這樣做。無論如何,如果你這樣做,你將失去對函數參數的所有靜態檢查。現在這有什麼價值? – sbi

8

可能boost::tuple是你需要什麼?

#include <boost/tuple/tuple.hpp> 

void myFunc (const boost::tuple<int, float, double>& t) 
{ 
    float f; 
    f = boost::get<1>(t); // f now equals bar 
} 

int main() 
{ 
    myFunc(boost::make_tuple(1, 2.0f, 3.0)); 
} 

它給你靜態類型檢查,你可以通過它的位置獲取元素。元組是未來標準的一部分。它可以作爲std::tr1::tuple用於一些編譯器。

如果所有參數都是同一類型,你可以使用std::vector

#include <vector> 

void myFunc (const std::vector<float>& t) 
{ 
    float f; 
    f = t[1]; // f now equals bar 
} 

int main() 
{ 
    std::vector<float> f_array; 
    f_array.push_back(1.0f); 
    f_array.push_back(2.0f); 
    f_array.push_back(3.0f); 
    myFunc(f_array); 
}