C++ 有没有一种方法可以用一种类型声明多个函数参数?

C++ 有没有一种方法可以用一种类型声明多个函数参数?,c++,function,types,arguments,C++,Function,Types,Arguments,我对编程非常陌生,不明白为什么不能声明参数 类型与我处理普通变量的方式相同,并且必须一次又一次地声明类型 我是说,为什么我必须: Func(int a, int b, float c) 而不是 Func(int a, b, float c) ? 当然,只要它们是同一类型的 我真的可以这么做,只是不知道怎么做 如果有可能,请告诉我怎么做 提前谢谢 @0x499602D2:如果参数声明更接近于对象声明,那么void f(int a,float c,d)可能相当于void f(int a,fl

我对编程非常陌生,不明白为什么不能声明参数 类型与我处理普通变量的方式相同,并且必须一次又一次地声明类型

我是说,为什么我必须:

Func(int a, int b, float c)
而不是

Func(int a, b, float c)
?

当然,只要它们是同一类型的

  • 我真的可以这么做,只是不知道怎么做
如果有可能,请告诉我怎么做

提前谢谢


@0x499602D2:如果参数声明更接近于对象声明,那么void f(int a,float c,d)可能相当于void f(int a,float c,float d)。该语言本可以使这项工作正确且一致。但事实并非如此基思·汤普森

这最好地回答了我的问题。但这是一个评论…

不,我不这么认为

但是,在函数声明中,可以省略变量名

Func(int a, int b);
可能是

Func(int, int);

编译器只需要有关签名的足够信息就可以确定在运行时调用哪个函数。

语法就是这样。我不知道有什么“原因”,但在(旧的)C中,没有显式类型的参数将默认为int(甚至有一种语法在右括号后提供类型),因此,我不确定这是否可以安全地放松。

我意识到这并不能完全回答可能提出的问题,但它确实回答了提出的问题:是的,可以声明一个函数,比如
f
,它接受
t
类型的
N
参数(并返回
RC
)不重复
T
,尽管使用了有趣的符号:

same_type_function<void, 2, int> f;

如果您想在
c++11
中使b具有与a相同的类型(以防以后更改a b的类型时反映出这一点),可以执行以下操作:

void Func( int a, decltype(a) b );
如果您想完全省略类型,就不能这样做。简单的回答是:语法不支持这一点。为什么?答案可能有很多,其中之一是:

void func( int, int ); // function declaration
我们现在放什么

void func( int, ); // function declaration? ugly and unreadable
此外,它还容易出错:

void func( int a, foobar ); // suppose this works
                            // now we add #include where foobar is defined as a struct
                            // function suddenly changes it's signature
我很确定会有更多的不良副作用,所以请相信,你不会想要的。

这就是为什么:

每件事都有一定的规则或合同。 理论上,您可以编写一个C编译器来代替:

func(int a, int b)
拿这个来说:

func(int a, b)
那太好了

但是

C语言的创造者决定每一个形式参数都必须有它的类型,因此我们今天就有了它。这只是一个你必须遵守的惯例

您必须遵循它,因为C/C++解析器希望您这样做,否则它将无法理解您

同样,你的问题是:

有没有一种方法可以用一种类型声明多个函数参数

理论上可以这样写:

有多种方法可以用一种类型声明函数参数吗


如果您同意某人以这种方式构造问题,则必须遵守此合同期限。

函数可以采用不同的类型。编译器如何知道您在这个场景中想要什么类型:
void f(int a,float c,d)
?如果
d
是一个
double
或用户定义的类,该怎么办?相关:阅读“K&R风格”函数声明。C在几年前就停止支持C++,从来没有。“为什么”是一个棘手的问题。显而易见的答案是“因为语言就是这样的”,但这能满足吗?这是语言创建者做出的设计决定。@0x499602D2:如果参数声明与对象声明更接近,那么
void f(int a,float c,d)
可能相当于
void f(int a,float c,float d)
。该语言本可以使这项工作正确且一致。它只是没有。@KeithThompson想象一下:struct foo{};无效foobar(inta,foo);第二种参数类型是什么?+1函数声明的许多奇怪之处来自K&R C。。。我甚至提到我是编程新手。。。我对那里发生的事一无所知。不过看起来很聪明。:)@user2962533:答案不必太严肃:我只是向大家展示了其他人声称做不到的事情实际上可以做到——某种程度上。如果对初学者来说有什么好处,那就是你可以使用
typedef
声明一个函数或成员函数,这是很少有人知道的:
typedef void(function_type)(int);f型函数通常这也不太有用,除非有许多函数都应该具有相同的类型。我不同意这种方法容易出错。您可以对变量声明说同样的话,但是您可以连续声明它们。您只需排列参数,以便相同类型的所有参数都位于它们应该位于的位置。USSR962533给出了更好的例子,为什么它容易出错,为什么它与变量声明不同?我认为它不会很好,它至少会与C++中的参数名省略冲突。
func(int a, b)