明确地专门介绍通用函数是快速

时间:2018-11-02 14:35:40

标签: c++ swift templates generics specialization

我正在尝试使用泛型函数在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<A>()并得到:错误:无法显式专门化泛型函数

1 个答案:

答案 0 :(得分: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()