gpt4 book ai didi

c++ - 显式专门化通用函数是快速的

转载 作者:行者123 更新时间:2023-11-28 14:04:39 27 4
gpt4 key购买 nike

我正在尝试使用泛型函数在 swift 类上调用静态方法,因此我真的不需要将类的类型作为函数签名的一部分。
似乎无法找到一种方法来做到这一点。

这是我正在尝试做的 C++ 示例:

#include <iostream>

class A {
public:
static void f(){
std::cout << "A::f()" << std::endl;
}
};

class B {
public:
static void f(){
std::cout << "B::f()" << std::endl;
}
};

template <typename T>
void callF(){
T::f();
}

int main(){
callF<A>();
callF<B>();
return 0;
}

这里我对 callF 使用显式特化我需要的类型。
我意识到 swift 的泛型不是模板,我不能只调用任何我想要的东西,如果它无效就让编译器中断,所以我添加了一个协议(protocol)并使泛型参数需要符合协议(protocol)(下面的 P example) 但我似乎无法找到一种方法来告诉编译器我想使用某种类型而不将其包含在函数的签名中。
这是我想出的最干净的方法:

protocol P{
static func f();
}

class A : P {
static func f(){
print("A.f()")
}
}

class B : P {
static func f(){
print("B.f()")
}
}

func callF<T:P>() -> T? {
T.f()
return nil
}

let _:A? = callF()
let _:B? = callF()

我真的不喜欢在我的代码中使用假人,但我无法解决这个问题。
关于如何避免在函数签名中使用假人并 swift 找出我想使用哪种类型的任何想法?我显然试过了 callF<A>()并得到:错误:无法显式特化泛型函数

最佳答案

您应该将要调用 f() 的类型作为输入参数传递给 callF 函数。

func callF<T:P>(on type:T.Type) {
type.f()
}

callF(on: A.self) // A.f()
callF(on: B.self) // B.f()

关于c++ - 显式专门化通用函数是快速的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53120554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com