2012-10-25 30 views
2

我對C++並不陌生,在可變參數傳遞中我有一個疑問。正如我在下面的示例代碼中提到的(此代碼完全不起作用,只是爲了解我的問題,我像這樣構建它),我有兩個函數func,帶有1個參數和2個參數(參數重載)。我在調用main函數,然後檢查是否需要調用2個參數或1個參數。這是問題,因爲我知道我可以在各自的else if語句中調用兩個函數,但我很想知道我是否只能使用一個函數進行管理。 (在下面的代碼我傳遞字符串不是整數,正如我之前提到的,這只是爲別人理解的目的。C++中的動態函數參數可能嗎?

#include<iostream.h> 
#include <string> 

void func(int, int); 
void func(int); 

void main() 
{ 
    int a, b,in; 

    cout << "Enter the 2 for 2 arg, 1 for 1 arg\n"; 
    cin << in; 

    if (in == 2) 
    { 
     string pass = "a,b"; 
    } 
    elseif (in == 1) 
    { 
     string pass = "a"; 
    } 
    else 
    { 
     return 0; 
    } 

    func(pass); 

    cout<<"In main\n"<<endl; 
} 

void func(int iNum1) 
{ 
    cout<<"In func1 "<<iNum1<<endl; 
} 

void func(int iNum1, int iNum2) 
{ 
    cout<<"In func2 "<<iNum1<<" "<<iNum2<<endl; 
} 
+0

你也可以是米通過執行'void func(int iNum1,int iNum2 = 0)',2參數func的iNum2有一個默認值。 – Asha

+0

@阿莎:我認爲默認值不會達到他的目的。 它總是調用void func(int,int),但從來沒有func(int)。 –

+1

編譯器在編譯時需要知道函數參數的數量來選擇合適的函數超載。所以你的問題的答案通常是「否」,在C++中沒有「動態參數」這樣的事情。但是,您可以像@ozox建議的那樣傳遞參數或任何其他「動態」結構的向量。 – Mikhail

回答

4

由羅納德解釋你可以使用stdarg頭文件的方法或者你可以使用一個函數,它的參數向量第一推參數向量,然後調用以下FUNC:。

func(const vector<int>& argv) { 
    for (vector<int>::const_iterator iter = argv.begin(); iter != argv.end(); ++iter) { 
    // Get the arguments 
    } 
    // Do what you want ... 
} 
1

我相信你可能感興趣的看着stdarg頭文件庫。樣例用法如下,

#include <cstdarg> 
#include <iostream> 

using namespace::std; 

void func(int, ...); 

int main(void) { 
    func(1, 10); 
    func(2, 20, 30); 
    return 0; 
} 

void func(int num_args, ...) { 
    va_list ap; 

    va_start(ap,num_args); 
    for(size_t loop=0;loop<num_args;++loop) { 
    if(loop>0) cout << " "; 
    cout << va_arg(ap,int); 
    } 

    va_end(ap); 

    cout << endl; 
} 
+0

嗨@羅納德,感謝您的回覆,但我正在尋找其他方式,兩個不同的功能(運算符重載),這裏函數調用的參數數量是可變的。 –

+0

嗨@JeshwanthKumarNK,我可能在這裏錯過了一些東西,如果你可以在預期的用例上多說一些,我們可以嘗試其他的東西。 (或者,也許ozox已經得到了解決方案?) –