1

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

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) {
   ...
}

因为它创建了更多可扩展性(您可以通过这种方式迭代参数)和更快的代码。

我只对提高自己的能力感兴趣,但我的直觉与这种方法背道而驰。他是对的吗?

4

3 回答 3

5

Horrible idea. I can't list the reasons why it's bad in a single answer, but the main problem is that it just doesn't work. As a simple example, you can't pass 3, and if you pass 0 it becomes a nullptr. More importantly, you have to cast the values back to a given type anyway, so why not specify the type in the signature?

Now there's a real C++ alternative, variadic templates:

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

In this case, the compiler will know all the types in Arguments..., there's no need to cast anything.

于 2013-10-28T23:45:51.453 回答
0

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

您的老板正在寻找但显然缺少的“可扩展性”被称为函数/方法重载。它作为适当设计的一部分而不是作为法令有它的位置。

于 2013-10-29T00:22:15.953 回答
0

我不同意上述答案,您的直觉是正确的,您应该尝试为函数创建一个显式接口。有时你不能有一个明确的接口,然后你应该考虑可变参数模板参数,但它们很少见。char 和 float 的两个 Ints 似乎是一个完全合理的函数参数。

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

于 2013-10-29T00:03:09.150 回答