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

C++ C++;函数参数或参数数组,c++,performance,C++,Performance,我的背景和直觉告诉我,我应该始终创建一个更紧密、更明确的函数接口,需要如下参数: bool someFunc(int param1, int param2, char param3, float param4) { ... } 或需要对象(结构或类),如: 我的老板告诉我,我应该使用以下方法: bool someFunc(void *params[], int size) { ... } 因为它创建了更具可扩展性(您可以通过这种方式迭代参数)和更快的代码 我只对提高我的能力感兴趣

我的背景和直觉告诉我,我应该始终创建一个更紧密、更明确的函数接口,需要如下参数:

bool someFunc(int param1, int param2, char param3, float param4) {
   ...
}
或需要对象(结构或类),如:

我的老板告诉我,我应该使用以下方法:

bool someFunc(void *params[], int size) {
   ...
}
因为它创建了更具可扩展性(您可以通过这种方式迭代参数)和更快的代码


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

糟糕的主意。我无法在一个答案中列出它不好的原因,但主要问题是它根本不起作用。举个简单的例子,你不能通过3,如果你通过0,它就会变成一个空ptr。更重要的是,您必须将值强制转换回给定的类型,那么为什么不在签名中指定类型呢

现在有一个真正的C++替代,变量模板:

template<typename... Arguments>
void Foo(Arguments... parameters);
模板
void Foo(参数…参数);

在这种情况下,编译器将知道
参数中的所有类型…
,不需要强制转换任何类型

可怕的想法。我无法在一个答案中列出它不好的原因,但主要问题是它根本不起作用。举个简单的例子,你不能通过3,如果你通过0,它就会变成一个空ptr。更重要的是,您必须将值强制转换回给定的类型,那么为什么不在签名中指定类型呢

现在有一个真正的C++替代,变量模板:

template<typename... Arguments>
void Foo(Arguments... parameters);
模板
void Foo(参数…参数);

在这种情况下,编译器将知道
参数中的所有类型…
,不需要强制转换任何类型

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


不管你的处境多么艰难,你都不想与老板作对。我对他的任何编程建议都持怀疑态度,他不是一个很好的程序员,更糟糕的是,他是一个老派的黑客c程序员(看看他是否到处使用宏)。我的建议是现在就按他的方式去做,然后如果你以后再使用这个函数,请修复它并尝试让其他人检查你的代码。

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


不管你的处境多么艰难,你都不想与老板作对。我对他的任何编程建议都持怀疑态度,他不是一个很好的程序员,更糟糕的是,他是一个老派的黑客c程序员(看看他是否到处使用宏)。我的建议是现在就按照他的方式去做,然后如果你以后再使用这个函数,请修复它,并尝试让其他人检查你的代码。

你的老板疯了。这种放荡在C语言中有一席之地,即使在那里你也会用到,而不是这个疯狂的构造。如果你想用动态类型的语言编程,要么不使用C++,要么使用变体类型的数组(或OR)。
您的上司正在寻找并明显缺少的“可扩展性”在其他方面称为函数/方法重载。这是一个合理设计的一部分,而不是法令。

你的老板疯了。这种放荡在C语言中有一席之地,即使在那里你也会用到,而不是这个疯狂的构造。如果你想用动态类型的语言编程,要么不使用C++,要么使用变体类型的数组(或OR)。
您的上司正在寻找并明显缺少的“可扩展性”在其他方面称为函数/方法重载。它是正确设计的一部分,而不是法令。

您不能对
params
进行迭代。你是想写
boolsomefunc(void*params[])
还是类似的东西(你还需要知道参数的数量)?如果是这样的话,如果它比按值传递内置类型更快,我会感到相当惊讶。你可能会因为这个问题而得到更多的关注,将它发布在:-)@DietmarKühl-是的,我的意思是,谢谢。更新以反映。Dirtmar评论第二。如果不将其转换回实际类型,则无法取消引用
void*
。另外,输入参数是一个没有长度的指针数组,因此您也不知道数组的大小。@tonga-你们都是对的,它需要参数的数量才能实现。更新以反映。您不能迭代
参数
。你是想写
boolsomefunc(void*params[])
还是类似的东西(你还需要知道参数的数量)?如果是这样的话,如果它比按值传递内置类型更快,我会感到相当惊讶。你可能会因为这个问题而得到更多的关注,将它发布在:-)@DietmarKühl-是的,我的意思是,谢谢。更新以反映。Dirtmar评论第二。如果不将其转换回实际类型,则无法取消引用
void*
。另外,输入参数是一个没有长度的指针数组,因此您也不知道数组的大小。@tonga-你们都是对的,它需要参数的数量才能实现。更新以反映。您是正确的,我必须将类型强制转换回,建议我通过将每个参数的类型作为参数中的另一个数组传递来执行此操作。我以前从未见过可变模板,也没有使用过可变模板,但通过阅读,我学到了很多(谢谢)。不幸的是,我们的编译器还不允许使用c++11功能。你是对的,我必须将类型强制转换回去,它是