2012-10-25 31 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已经得到了解决方案?) –