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

C++ function parameters or parameter array

本文关键字:参数 数组 C++ 函数      更新时间:2023-10-16

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

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...中的所有类型,无需强制转换任何内容。

我不同意上面的答案,你的直觉是对的,你应该尝试为函数创建一个显式接口。 有时你不能有一个显式的接口,然后你应该考虑可变参数模板参数,但它们很少见。 两个 Int 一个字符和浮点数似乎是一个完全合理的函数参数。

然而,你

处于一个非常棘手的境地,你不想反对你的老板。 我会怀疑他的任何编程建议,他要么不是一个非常好的程序员,要么更糟糕的是那些老派的黑客c程序员之一(看看他是否到处都使用宏)。 我的建议是现在就按照他的方式做,然后如果你再次使用该函数,以后修复它并尝试让其他人审查你的代码。

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

你的老板正在寻找但明显缺少的"可扩展性"也称为函数/方法重载。它作为适当设计的一部分,而不是作为法令。