如何知道是否传递了可选的函数参数,还是使用了默认的函数参数?

时间:2016-03-02 05:50:06

标签: c++

void foo (  int arg1, int arg2)

foo(1)

foo(1,2)

我如何知道int arg2是否正在使用像第二个foo调用中那样传递的可选函数参数,或者像第一个foo中那样使用了默认值?

更新

公共:

头文件

// Point 1
void fireworkShipment(stack<Firework*>&);
void sellFireworks(stack<Firework*>&, int quantity);

// Point 2
void metalShipment(stack<Metal>&);
~FireworkFactory();

// Point 3 for correctness, Point 4 for O(1) runtime
void sellFireworks(stack<Firework*>&, int quantity, Color color);
void sellFireworks(stack<Firework*>&, int quantity); //error here

cpp文件:

    void FireworkFactory::sellFireworks(stack<Firework*>& customerStack, int quantity, Color color){
    // TODO
    cout<< "which color: " << color << "\n";
    for (int i = 0; i< fireworkstorage.size(); i++) {
        if (fireworkstorage.front()->getColor() == color && quantity != 0) {
            customerStack.push(fireworkstorage.front());
            cout<< "Color: " <<fireworkstorage.front()->getColor() << "\n";
            fireworkstorage.pop();
            quantity--;
            cout<<  "Quantity: " <<quantity << "\n";
        } else {
            fireworkstorage.push(fireworkstorage.front());
            fireworkstorage.pop();
        }
    }    
}

void FireworkFactory::sellFireworks(stack<Firework*>& customerStack, int quantity){
    for (int i = 0; i<quantity; i++) {
        customerStack.push(fireworkstorage.front());
        fireworkstorage.pop();
    }
}

3 个答案:

答案 0 :(得分:3)

你做不到。但是,您可以使用一个参数创建重载函数:

#include <iostream>

void awesome_function_with_default_parameters(int arg1, int arg2 = 42)
{
    std::cout << "Doing some awesome work with " << arg1 << " and " << arg2 << std::endl;
}

void foo(int arg1, int arg2)
{
    std::cout << "Both parameters passed" << std::endl;
    awesome_function_with_default_parameters(arg1, arg2);
}

void foo(int arg1)
{
    std::cout << "Only one parameter passed" << std::endl;
    awesome_function_with_default_parameters(arg1);
}

int main()
{
    foo(1);
    foo(1, 314);
    return 0;
}

答案 1 :(得分:1)

没有办法知道。 如果foo(1)有效,则假定使用了可选参数。

答案 2 :(得分:0)

正如其他人已经指出的那样,无法判断是否使用了默认参数,或者是否明确指定了值。这是因为默认参数在编译时完全处理,并且程序在运行时不知道它们。所以理论上你可以有

void myFunc(int a, int b = 42);
标题和cpp中的

执行

void myFunc(int a, int b) {
  bool defaultParamUsed = (b ==42);
  // rest of function
}

但这意味着即使是明确提供42的人也会被视为使用了默认参数。

只是为了使问题更复杂,因为编译器处理默认参数,你可以通过为相同的函数签名提供不同的默认参数声明来很好地拍摄自己。在标题a.h中考虑:

void myFunc(int a, int b=42);

在标题b.h中:

void myFunc(int a, int b=70);

并在实现文件aMess.cpp中:

void myFunc(int a, int b) // ...

编译器可能(我很确定但没有尝试过)抱怨(由于重复声明)如果ah和bh都包含在任何地方,但程序的不同部分可能包含不同的标题,因此可以使用不同的可选项参数。
很难看出在什么情况下人们会想要这个。一个案例可能是形式的函数

void doSomething(int param, int version);

现在,不同的标头可以指定不同的版本作为默认值,并且用户仍然可以明确地覆盖该行为,以防他或她需要特定版本的行为。