variadic 相关问题

在计算机科学中,如果操作符或函数可以采用不同数量的参数,则它是可变参数;也就是说,如果它的arity不固定。

如何在MSVC下正确转发C/C++中的非模板、可变参数

我正在尝试在两个函数之间转发非模板变量参数。这些函数都不属于我,所以我无法更改它们的签名。我使用 va_args 来达到这个目的,但不幸的是我的解决方案......

回答 1 投票 0

为什么我会在这里遇到分段错误?

声明 i32 @vprintf(i8*, i8*) 声明 i32 @printf(i8*, ...) 声明 void @llvm.va_start(i8*) 声明 void @llvm.va_end(i8*) @.str_3 = 私有 unnamed_addr 常量 [2 x i8] c" A " @...

回答 1 投票 0

如何在带有参数折叠的可变参数函数中传递不同的数据类型?

制作一个链接列表库,我想传递多个值以使附加项目更容易,所以我创建了一些可变参数函数,在使用 int 值进行测试时,wor...

回答 1 投票 0

C++17:在可变参数模板之前显式第一个模板参数

我正在尝试为任意维度的对称块矩阵编写一个通用类。仅给出上三角部分: ABC 德 F 所以块的数量是 n*(n+1)/2 其中 n 是 ...

回答 1 投票 0

类型参数包:如何返回元组而不是数组?

首先我有这段代码,它工作得很好: 协议 ComponentAccessible {} 扩展 ComponentAccessible { func 组件(_ keyPaths:重复 KeyPath 首先,我有这段代码,它工作得很好: protocol ComponentAccessible {} extension ComponentAccessible { func components<each T>(_ keyPaths: repeat KeyPath<Self, each T>) -> (repeat each T) { { (repeat self[keyPath: each keyPaths]) } } } // MARK: - Usage extension URL: ComponentAccessible {} url.components(\.scheme, \.host, \.path) 但现在我想尝试一种稍微不同的方法(利用PartialKeyPath): extension ComponentAccessible { func components<each T>(_ keyPaths: PartialKeyPath<Self>...) -> (repeat each T) { keyPaths.map { self[keyPath: $0] } } } 这无法编译,因为我返回的是一个数组,而不是一个元组。 首先,这不是类型安全的。 PartialKeyPath不知道键路径值的类型,只知道根的类型。因此,为了能够返回 (repeat each T),您需要进行投射。 其次,keyPaths、PartialKeyPath<Self>...的类型不是包扩展。它需要是一个包扩展,以便您能够返回具有匹配数量的元素的元组。 所以你需要类型包each T出现在keyPaths的类型中somewhere,这样你就可以为keyPaths的类型编写包扩展,即调用者has传入类型他们想要这样或那样。 此时,您应该意识到您应该继续使用KeyPath<Root, Value>,因为您可以在那里直接使用each T。如果您想要“语法练习”,您可以使用一对 PartialKeyPath<Self> 和元类型。 extension ComponentAccessible { func components<each T>(keyPaths: repeat (PartialKeyPath<Self>, (each T).Type)) -> (repeat each T) { (repeat self[keyPath: (each keyPaths).0] as! each T) } } 您也无法返回 Any 的元组。虽然您可以通过编写类型别名“欺骗”编译器认为您正在使用类型包,但编译器稍后仍会“查看您在做什么”。这些不起作用: typealias A<X> = Any typealias PKP<X, Y> = PartialKeyPath<X> // now you can write (repeat A<each T>) to mean a variadic tuple of Anys, but... extension ComponentAccessible { // the compiler can see that you are not using T anywhere, // and no, you cannot add a dummy metatype parameter with a default value // parameter pack parameters cannot have default values func components<each T>(keyPaths: repeat PKP<Self, each T>) -> (repeat each A<each T>) { (repeat self[keyPath: each keyPaths]) } // the compiler cannot form the constraint that keyPaths should have the same shape as the return type func components<each T>(keyPaths: repeat PKP<Self, each T>) -> (repeat each T) { (repeat self[keyPath: each keyPaths] as! each T) } }

回答 1 投票 0

将 `(String, Int)...` 可变参数函数转换为 ExpressibleByDictionaryLiteral 的字典

我有当前通过采用数组或字典的单参数初始化函数初始化的对象。 我意识到我可以使用 ExpressibleByArrayLiteral 和 ExpressibleByDictionaryLi...

回答 1 投票 0

可变参数模板中类型推导的混乱

我有一个具有多个构造函数的类,一个是可变参数,一个在可变参数之前接受一个额外的可调用函数。然而,我创建的对象会导致我不会的重载决策

回答 1 投票 0

将多个数组作为函数的参数

我是 C 新手,我一直在尝试编写一个函数,该函数接受尽可能多的数组参数,将它们按元素添加在一起,并将结果存储在一个“结果”数组中,也以

回答 1 投票 0

在 Swift 4 中为 os_log 传递可变参数

我正在尝试在 Swift 4 / iOS 11 中为 os_log 编写一个方便的包装器,但是我在传递可变参数方面遇到了一场艰苦的战斗。 基本上,我想编写一个看起来......的函数

回答 4 投票 0

可变参数之后的可选命名参数

在 PHP 7.x 中,我有一些函数可以获取参数数组和一些标志。 一个简化的示例: 在PHP 7.x中,我有一些函数可以获取参数数组,然后获取一些标志。 一个简化的示例: <?php function sum($param, $min=0, $max=100) { $sum = 0; foreach ($param as $value) if ($value>=$min && $value<=$max) $sum += $value; return $sum; } echo sum([100, 10, 4], 0, 50); ?> 现在在PHP 8.1中,我想将函数定义更改为variadic(解包数组),并将函数调用更改为named arguments 所以我将函数定义更改为: function sum(...$param, $min=0, $max=100) 以及对此的函数调用: echo sum(100, 10, 4, max:50); 但我收到此错误消息: Fatal error: Only the last parameter can be variadic in test.php on line 2 有什么办法解决吗? 蒂亚 您需要重写订单,如错误所示: 可变参数作为最后一个参数。 function sum($min=0, $max=100, ...$param)

回答 1 投票 0

模板参数能否无缝匹配类型和模板,也许作为变量的一部分?

我的代码使用类似于 Boost.PolyCollection 中的静态类型构造来存储一些状态。 我认为,我的问题至少可以通过下面的代码来说明。基本上我正在与

回答 1 投票 0

C 中的可变函数指针

我想实现一个函数,它接受一个函数及其参数,然后调用它。 我进行了很多搜索,但无法用可变参数函数来实现它。 我想要一种干净的方式来在 c 之后记录 stdio...

回答 1 投票 0

Swift 中的可变泛型与值和类型参数包

有两种进化建议: 可变参数泛型以及值和类型参数包。 那么区别是什么呢?他们在概念上感觉非常相似。 第二个语法超重,是

回答 1 投票 0

Swift 中带有可变参数的“some”关键字

协议 myProtocol {} func doSomething(with params: (some myProtocol)...) { // 这里是实现 } 扩展 Int: myProtocol {} 做某事(使用:1、2、3) f处编译错误...

回答 1 投票 0

在可变参数预处理器类函数宏中实现与 __VA_OPT__ 相反的效果[关闭]

如果没有可变参数,如何实现 VA_OPT 的相反效果,仅扩展。

回答 1 投票 0

如何从具有不同参数签名的函数中解析参数值?

我有一个名为“Time”的函数,它接受 0 到 6 个参数。 函数时间(年,月,日,小时,分钟,选项){ } 如果

回答 4 投票 0

C++17:传递多个可调用对象及其参数

我想编写一个函数(C++17,如果重要的话),它接受多个可调用对象及其参数并在循环中执行它们。我也想避免任何中间

回答 1 投票 0

构造对象后将可变参数传递给方法

我正在尝试构建一个模板类,一旦使用其可变参数构造,其成员函数就可以使用这些参数,而无需用户手动将它们插入回去。这段代码(

回答 1 投票 0

TypeScript 中可迭代对象的可变压缩

我正在尝试在可迭代对象上编写可变参数zip,同时保留类型。例如, 函数* 自然数(max=10) { for (令 i=0; i 我正在尝试在可迭代对象上编写可变参数 zip,同时保留类型。例如, function* naturals(max=10) { for (let i=0; i<max; i++) yield i } const x = [1, 2, 3] const y = ["a", "b", "c"] const zipped = zip(naturals(), x, y) console.log([...zipped]) // => [[0, 1, "a"], [1, 2, "b"], [2, 3, "c"]] function* zip<?>(...iterables:?[]) { const iterators = iterables.map(iter => iter[Symbol.iterator]()) ... } 是否有类型签名可以帮助保留我的类型? 您可以给 zip() 以下呼叫签名: declare function zip<T extends any[]>( ...iterables: { [I in keyof T]: Iterable<T[I]> } ): Iterable<T>; 类型参数 T 中的 generic 表示输出中每个元素中数组的类型(即函数返回 Iterable<T>)。这预计是一个元组类型。 输入类型是数组/元组类型T上映射类型的剩余参数,其中T的每个元素都包裹在Iterable中。这种映射类型是 同态(具有 in keyof T,请参阅 “同态映射类型”是什么意思? 了解更多信息),因此 TypeScript 可以从中推断出 T。 让我们在您的示例中尝试一下: const zipped = zip(naturals(), x, y) // const zipped: Iterable<[number, number, string]> 此处 iterables 是可分配给 [Iterable<number>, Iterable<number>, Iterable<string>] 的元组类型,因此编译器将 T 推断为 [number, number, string]。所以输出类型是预期的Iterable<[number, number, string]>。 Playground 代码链接

回答 1 投票 0

带有可变参数的 Metal Shader 函数,从 SwiftUI 调用?

我的应用程序需要在 SwiftUI 视图中渲染场强,即为视图的每个点分配具有与坐标相关的不透明度的颜色。 这可以使用 Canvas 来完成,如此处所述,...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.