簡體   English   中英

C ++函數參數或參數數組

[英]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::variantQVariant )。

您的老板正在尋找的“可擴展性”而顯然缺少的“可擴展性”也稱為函數/方法重載。 它的位置是適當設計的一部分,而不是法令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM