【问题标题】:Explicitly specialize a generic function is swift明确地专门化一个通用函数是迅速的
【发布时间】:2018-11-02 14:35:40
【问题描述】:

我正在尝试使用泛型函数在 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 的泛型不是模板,我不能只调用我想要的任何东西,如果它无效就让编译器中断,所以我添加了一个协议并使泛型参数需要符合协议(P 在下面示例)但我似乎无法找到一种方法来告诉编译器我想使用某种类型而不将其包含在函数的签名中。
这是我想出的最干净的方法:

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()

我真的不喜欢在我的代码中使用假人,但我无法解决这个问题。
关于如何避免在函数签名中使用假人并快速找出我想使用哪种类型的任何想法?我显然尝试了callF&lt;A&gt;() 并得到:错误:无法明确专门化泛型函数

【问题讨论】:

    标签: c++ swift templates generics specialization


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我仍然希望我不必将类型作为参数传递,而是作为编译时间指示,它不会将任何内容推送到堆栈,但它比我的解决方案更干净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2019-11-30
    相关资源
    最近更新 更多