Próbuję zaimplementować w C++ podobnego szablonu z C# rodzajowych i wzór polityki opartej na this answerWdrażanie wieloparametrowego C++ szablonu jak zachowanie w C# za pomocą wzoru Polityka
To jest przykład wzoru:
interface ISomePolicy<T,U>
{
void _doSomething(U u);
}
class MyClass<T,U>:
ISomePolicy<int, double>,
ISomePolicy<int, int>
{
internal T myElement {get;set;}
public MyClass(T Element) {
myElement = Element;
}
void ISomePolicy<int, double>._doSomething(double u)
{
Console.WriteLine("this is int, double");
}
void ISomePolicy<int, int>._doSomething(int u)
{
Console.WriteLine("this is int, int");
}
}
static class MyClassExtension
{
//What I want to do
public static void doSomething<P, T, U>(this P oTh, U u) where P : MyClass<T, U>, ISomePolicy<T, U>
{
oTh._doSomething(u);
}
}
My przeznaczone zachowanie jest tak:
MyClass<int, double> oClass = new MyClass<int, double>(3);
oClass.doSomething(0.5); //This works
oClass.doSomething(1); //This works
oClass.doSomething("This should fail"); //Breaks at compile time
MyClass<string, double> oClass1 = new MyClass<string, double>("sadfsd"); //Not implemented, wasn't able to prevent the construction.
oClass1.doSomething(0.4); //Breaks at compile time
Ale do tej pory nie był w stanie dokonać .net akceptuje Generic Extension with less arguments than parameters
Mogę nazwać interfejs jawnie, co jest okropnym gadatliwym pokonaniem celu tego wszystkiego.
oClass.doSomething < MyClass<int, double>,int,double>(0.5);
Myślałem, że wokół pracy z obwolutą:
static class MyClassExtension{
private static void wrappedDoSomething<P, T, U>(this P oTh, U u)
where P : MyClass<T, U>, ISomePolicy<T, U>
{
oTh._doSomething(u);
}
public static void doSomething<T, U>(this MyClass<T, U> oTh, U u)
{
oTh.wrappedDoSomething<MyClass<T, U>, T, U>(u);
}
}
Ale wrapper nie może rozwiązać oba typy dla funkcji zawinięte w przypadku braku z:
Błąd 1 typ "MyClass" nie może być użyty jako parametr typu "P" w typie ogólnym lub metodzie "MyClassExtension.wrappedDoSomething (P, U)". Nie ma niejawna konwersja z „MojaKlasa odniesienie do ” „ISomePolicy”
Wszelkie spostrzeżenia, aby rozwiązać ten problem parametrów lub przeprojektować to wszystko są doceniane.
Dla kontekstu będzie to używane do zawijania tłumacza I/O. T
w moim przypadku byłby docelowym formatem we/wy, a U
reprezentacją obiektu tych danych wykorzystywanych przez mój framework.
Jestem świadomy, że można to łatwo osiągnąć za pomocą delegatów lub interfejsów, ale celem jest, aby użytkownik struktury łatwo tworzył żądane tłumaczenie, a jeśli implementacja nie istnieje, może być trywialnie dodana do wspólnej berło.
EDYCJA: Rozwiązanie ogólnej metody z wnętrza innej ogólnej metody/klasy wydaje się nie działać na mono.
Dlaczego w ogóle potrzebny jest parametr T? –
Aby sprawdzić w czasie kompilacji, '' ISomePolicy 'jest zaimplementowany przez' na MyClass' (patrz 'MyClassExtension') –
xvan