C ++函数参数或参数数组

时间:2013-10-28 23:26:50

标签: c++ performance

我的背景和直觉告诉我,我应该总是通过要求这样的参数来创建一个更紧凑,更明确的函数接口:

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 :(得分:5)

可怕的主意。我无法列出单个答案中出现问题的原因,但主要问题是它无法正常工作。举个简单的例子,你不能传递3,如果你传递0就会变成nullptr。更重要的是,您必须将值转换回给定类型,那么为什么不在签名中指定类型呢?

现在有一个真正的C ++替代品,可变参数模板:

template<typename... Arguments>
void Foo(Arguments... parameters);

在这种情况下,编译器将知道Arguments...中的所有类型,不需要转换任何内容。

答案 1 :(得分:0)

我不同意上面的回答,你的直觉是正确的,你应该尝试创建一个函数的显式接口。有些时候你不能有一个显式接口,然后你应该考虑可变参数模板参数,但它们很少见。两个Ints char和float看起来像是一个非常合理的函数参数。

然而,你处于一个非常棘手的境地,你不想反对你的老板。我会怀疑他的任何编程建议,他要么不是一个非常优秀的程序员,要么是那些老派的hacky c程序员中的一员(看看他到处使用MACROS)。我的建议是现在按照他的方式进行,然后如果你再次使用该功能,请稍后修复它并尝试让其他人检查你的代码。

答案 2 :(得分:0)

你的老板很疯狂。这样的放荡在C中占有一席之地,即使在那里你也会使用varargs,而不是这种疯狂的构造。如果要使用动态类型语言进行编程,请不要使用C ++,也不要使用变体类型的数组(例如boost::variantQVariant)。

您的老板正在寻找并且明显缺失的“可扩展性”也称为函数/方法重载。它作为正确设计的一部分而不是作为法令。