2011-07-19 14 views
1

私はLokiのC++ HierarchyGeneratorが好きで、C#でも同じことをしたいと思います。Lokiのタイプリスト類似::階層ジェネレータを使用したタイプリスト

私が最後に望むのは、与えられたタイプリストの引数ごとに仮想関数を持つクラスです。

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#で:

C++のコード私が変換したいと思います。あなたはロキに精通していない場合は、上記のFooSendクラスがデフォルトになります

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

しかし、新しいのTListが与えられたとき、それはTListの中の種類に基づいて、異なる階層になるだろう。

LokiにGenLinearHierarchyが存在する場合は、これも興味があります。

私はいつも言語間の翻訳を試みることができましたが、私はC#を初めて使っていて、テンプレートとジェネリックの微妙な違いを学ぶのではなく、自分の仕事をしたいと思っています。

答えて

0

使用して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

私はロキを知らないが、複数の継承を使用していると私は思っています。 c#は多重継承をサポートしておらず、私がC#で長年働いて学んだことは、それを見逃さないことです。

+0

LinearHierarchyは多重継承ではない(それは継承のラインである - 上記の例では、それは 'FooSendだろう:FooSend >'、ここで 'FooSend >:FooSend >') – Dale

+0

しかし、C #ScatterHierarchyを行う方法は、上記のすべてを持ちますが、クラス継承の代わりに 'SenderV >'、 'SenderV > 'というインターフェースを持つことです。ポイントは、クラスを "Foo <1>' - 'Foo '型の "Sender"として記述することです。私が入れたい~20個のクラス( 'Foo <1>'〜 'Foo <20>')があると思いますTypeList、そして私はこのパターンに従ういくつかのクラスを持っていたいと思いますが、すべてが少し異なるタイプリスト(マージ可能です)を持っているので、このルートに向かって私をプッシュするのは純粋な怠惰ではありません。 – Dale

関連する問題