繁体   English   中英

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

[英]C++ function parameters or parameter array

我的背景和本能告诉我,应该始终通过要求如下参数来为函数创建更紧密,更明确的接口:

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

我不同意上面的答案,您的直觉是正确的,您应该尝试为函数创建一个显式接口。 有时您可能没有显式接口,然后应考虑可变参数模板参数,但这种情况很少见。 一个char和float两个整数似乎是一个非常合理的函数参数。

但是,您处在非常棘手的情况下,不想与您的老板对立。 我会对他提出的任何编程建议表示怀疑,他不是一个很好的程序员,或更糟糕的是那些那些老派的黑C程序员(看看他是否在各处都使用了MACROS)。 我的建议是按现在的方式进行操作,然后,如果您再次使用该功能,请稍后对其进行修复,并尝试让他人检查您的代码。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM