2013-10-28 60 views
1

我的背景和直覺告訴我,我應該總是通過要求參數來創建更緊密和更明確的接口,這樣的函數:C++函數的參數或參數數組

bool someFunc(int param1, int param2, char param3, float param4) { 
    ... 
} 

或需要一個對象(結構或類)像:

class someObject { 
    ... 
    int p1; 
    int p2; 
    char c1; 
    float p4; 
} 

我已經被我的老闆告訴我,我應該使用類似:

bool someFunc(void *params[], int size) { 
    ... 
} 

,因爲它會創建更多的可擴展(您可以通過這種方式迭代參數)和更快的代碼。

我只對提高自己的能力感興趣,但我的直覺違背了這個方法。他對嗎?

+1

你不能迭代'params'。你的意思是寫'bool someFunc(void * params [])'或者其他的東西(你還需要知道參數的數量)?如果是這樣,如果它比按值傳遞內置類型更快,我會感到驚訝。 –

+0

您可能會在http://programmers.stackexchange.com/發佈此問題時獲得更多關注:-) –

+0

@DietmarKühl - 是的,我的意思是,謝謝。更新以反映。 –

回答

5

糟糕的想法。我無法列出單個答案中不好的原因,但主要問題是它不起作用。作爲一個簡單的例子,你不能傳遞3,並且如果你傳遞0,它就成爲一個nullptr。更重要的是,你不得不將值返回給定類型,爲什麼不在簽名中指定類型呢?

現在有一個真正的C++替代,可變參數模板:

template<typename... Arguments> 
void Foo(Arguments... parameters); 

在這種情況下,編譯器會知道Arguments...所有類型的,就沒有必要投什麼。

+0

你是對的,我將不得不將類型轉換回來,建議我通過將每個參數的類型作爲參數中的另一個數組來傳遞。我從來沒有見過,或與variadic模板工作過,但我已經瞭解了很多關於他們的讀物(謝謝)。不幸的是,我們的編譯器還不支持C++ 11功能。 –

0

我不同意上面的答案,你的直覺是正確的,你應該嘗試創建一個明確的函數接口。有些時候你不能有明確的接口,然後你應該考慮可變參數模板參數,但它們很少。兩個Ints一個char和float看起來像是一個完全合理的函數參數。

然而,你處於一個非常棘手的狀況,你不想違揹你的老闆。我會懷疑他的任何編程建議,他要麼不是一個很好的程序員,要麼就是那些老派的hacky c程序員中的一個(看看他是否在任何地方使用MACROS)。我的建議是現在就按照他的方式來做,然後如果你以後再次使用該功能來修復它並嘗試讓別人來檢查你的代碼。

+0

感謝您的建議和驗證。我處於非常棘手的狀況,我打算編寫最好的代碼,即使這些都是讓我被解僱的理由(我沒有找到其他工作)。我只是小到不能確定我什麼時候是對的,或者他是 - 因此是職位。我想學習正確的答案,我會實現這一點。 –

0

你的老闆很瘋狂。這樣的放蕩在C中佔有一席之地,甚至在那裏你會用varargs,而不是這個瘋狂的構造。如果要用動態類型語言進行編程,請不要使用C++,也不要使用變體類型的數組(如boost::variantQVariant)。

你的老闆正在尋找並明顯缺少的「可擴展性」被稱爲函數/方法重載。它作爲正確設計的一部分而不是作爲詔書。

+0

我同意你的每一點,除了我工作的地方,我們不幸的是無法承擔使用諸如boost或甚至STL之類的東西的代價。 –

+1

@ user2705235:那麼,你的老闆認爲你自己的自制解決方案由C++經驗少得多的人完成會比'boost :: variant'好?對,祝你好運。像'boost'這樣的流行庫有許多挑剔的人試圖通過發現問題來展示自己。諸如'boost :: variant'之類的東西經常被多次優化爲hell和back。 –