Я пытаюсь вызвать статический метод в быстром классе, используя универсальную функцию, поэтому мне действительно не нужно, чтобы тип класса был частью сигнатуры функции.
Не могу найти способ сделать это.
Вот пример С++ того, что я пытаюсь сделать:
#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>()
и получил: ошибка: невозможно явно специализировать универсальную функцию