[英]C++ function parameters or parameter array
我的背景和本能告訴我,應該始終通過要求如下參數來為函數創建更緊密,更明確的接口:
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) {
...
}
因為它創建了更可擴展的代碼(您可以通過這種方式遍歷參數)和更快的代碼。
我只對提高自己的能力感興趣,但是我的直覺與此方法背道而馳。 是嗎
可怕的主意。 我無法在一個答案中列出它不好的原因,但是主要的問題是它根本不起作用。 舉一個簡單的例子,您不能傳遞3,如果傳遞0,它將成為nullptr。 更重要的是,無論如何您都必須將值轉換回給定的類型,那么為什么不在簽名中指定類型呢?
現在有一個真正的C ++替代方法,可變參數模板:
template<typename... Arguments>
void Foo(Arguments... parameters);
在這種情況下,編譯器將知道Arguments...
所有類型,而無需強制轉換任何內容。
我不同意上面的答案,您的直覺是正確的,您應該嘗試為函數創建一個顯式接口。 有時您可能沒有顯式接口,然后應考慮可變參數模板參數,但這種情況很少見。 一個char和float兩個整數似乎是一個非常合理的函數參數。
但是,您處在非常棘手的情況下,不想與您的老板對立。 我會對他提出的任何編程建議表示懷疑,他不是一個很好的程序員,或更糟糕的是那些那些老派的黑C程序員(看看他是否在各處都使用了MACROS)。 我的建議是按現在的方式進行操作,然后,如果您再次使用該功能,請稍后對其進行修復,並嘗試讓他人檢查您的代碼。
你的老板瘋了。 這樣的放盪在C中占有一席之地,即使在那兒,您也將使用varargs ,而不是這種瘋狂的構造。 如果要使用動態類型的語言進行編程,請不要使用C ++或使用變量類型的數組(例如boost::variant
或QVariant
)。
您的老板正在尋找的“可擴展性”而顯然缺少的“可擴展性”也稱為函數/方法重載。 它的位置是適當設計的一部分,而不是法令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.