这个技术有术语吗?一个著名的例子是WinAPI:SendMessage( hwnd, msg, info1, info2 )
,其中参数#3和#4仅对msg
有意义(这意味着在某些情况下,只需要这两个参数之一或不需要)。 See MSDN。
改写:具有一个始终接受多个参数的通用函数,但是解释它们取决于先前的参数。我不想谈论开放数组,开放参数,无类型参数……我知道这些。这不是我要的-我想使用这种类型的函数(可能还包括如何调用非特定参数的术语)。
这与强制转换或通过引用传递无关-参数类型始终相同。其他示例:calculate( char operation, int a, int b )
然后用作
calculate( '+', 2, 5 )
(参数#2和#3是被加数)calculate( '/', 4, 2 )
(参数2是除数,参数3是除数)calculate( '!', 3, 0 )
(参数#2是阶乘,而参数#3未使用)在所有这些情况下,数据类型始终相同且从不强制转换。但是参数#2和#3的含义因参数#1而异。既然是这种情况,就很难给这些参数起一个有意义的名字。 当然,该函数本身很可能使用 switch(),但这与我的问题无关。如何调用参数#2和#3,在其中找不到不同的名称,但数据类型始终相同?
答案 0 :(得分:1)
msg参数通过简单的switch语句“更改”参数。开关中的每个“ msg”都知道所需的参数(带有类型),并对其进行适当的转换。
此“ 技术”称为按引用传递或按地址传递。后者通常用于方法指针。
如果您要输入的是特殊名称,这是常规功能,方法或过程。
所引用的函数是Win32 API函数,可以称为“ Windows函数调用”。
答案 1 :(得分:0)
这是一个静态参数和多个动态参数的示例。 静态是“ msg”,动态是如下:
这些参数是通用指针。通过引用。它们可以指向任何数据类型或没有值,即空指针。由发送方将内存锁定在适当的位置,由接收方方法正确地解释指针(通过指针强制转换)。
这是无类型参数传递的示例。唯一传递的是内存地址。这样做很危险,因为传递的类型必须提前约定(按照约定,而不是像键入的语言构造那样进行约定),并且必须在调用的两侧进行匹配。
这在C ++之前是很普遍的,在C时代,我们只有C结构可以传递。导致许多常规故障保护错误。从那时起,类型化接口大部分已通过库替换了通用等效项。但是底层的Win32方法保持不变。自其诞生以来,主要的重大变化是接受64位指针。
答案 2 :(得分:0)
尽管未得到广泛支持,但是您所指的将是依赖类型的函数(或依赖类型的参数)。
引用wikipedia on dependent types
“整数对”是一种类型。由于对值的依赖性,“第二对大于第一对的整数对”是从属类型。
参数的类型可能取决于值。 info1
的类型取决于值msg
,info2
也取决于值。
为了使这种方法能够在没有依赖类型的语言中工作,为依赖参数指定了非常通用的类型,只有在有更多信息可用时,才会稍后对其进行细化。仅在运行时知道msg
的类型时,才假定info1
和info2
的类型。即使该语言不允许您表达这种依存关系,我仍会将该方法称为依存类型。