C # Typelist аналог Loki :: Typelist с генератором иерархии - PullRequest
1 голос
/ 19 июля 2011

Мне понравился C ++ HierarchyGenerator от Loki, и я хочу сделать то же самое в C #.

В конце концов, мне нужен класс, который имеет виртуальную функцию на аргумент в заданном списке типов.

C ++ код, который я хотел бы преобразовать:

template <class T>
class SenderV 
{
public: 
    virtual void Send(T t) = 0;
};
template <int i>
class Foo // Just to make it easy to show typelist, it's not interesting. 
{ /* doIt definition */ };
typedef TYPELIST_2(Foo<1>,Foo<2>) FooSendables;

template <typename TList=FooSendables>
class FooSend : public Loki::GenScatterHierarchy <TList,SenderV>
{
public:
    void Send(Foo<1> f) {f.doIt();std::cout<<"Sending Foo1."<<std::endl;};
    void Send(Foo<2> f) {f.doIt();std::cout<<"Sending Foo2."<<std::endl;};
};

в C #.Если вы не знакомы с Loki, класс FooSend выше по умолчанию будет иметь значение:

class FooSend : SenderV<Foo<1> >, SenderV<Foo<2> >//including every type in TList
{ /*... as above */};

Но когда дается новый TList, это будет другая Иерархия, основанная на типах в TList.

Меня также интересует GenLinearHierarchy в Loki, если он существует там.

Я всегда мог пытаться переводить между языками, но я не большой поклонник пробовать это, так как я новичок в C # и просто хочу выполнять свою работу, а не изучать тонкую разницу между шаблонами идженерики.

Ответы [ 2 ]

0 голосов
/ 19 июля 2011

с использованием t4:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>

<#@ import namespace="System.Text" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System" #>


namespace SomeNamespace 
{

    public interface Sender<T> 
    {
        void Send<T>(T t);
    };
    <# string[] strings={"Foo1","Foo2","Foo3"};
        foreach (String node in strings) 
        { #> partial class <#= node #> {}
        <# } #>
    class z {}
    public class FooSend: Sender<z><# 
         foreach (String node in strings) 
         { #>, Sender<<#= node #>> <# } #>
    {
    }
}

Я не могу получить форматирование так, как мне хотелось бы (и независимо от того, форматирование t4 всегда будет безобразным), но это решает мою проблему.

Приведенный выше код дает:

namespace SomeNamespace 
{

    public interface Sender<T> 
    {
        void Send<T>(T t);
    };
     partial class Foo1 {}
     partial class Foo2 {}
     partial class Foo3 {}
     class z {}
    public class ParentClass : Sender<z>, Sender<Foo1> , Sender<Foo2> , Sender<Foo3>  {
    }    
}

Что соответствует моим потребностям.

0 голосов
/ 19 июля 2011

Я не имею представления о Локи, но мне кажется, что вы используете множественное наследование.C # не поддерживает множественное наследование, и я многому научился, работая с c #, это то, что я не скучаю по нему.

...