1

私は Loki の C++ HierarchyGenerator が大好きで、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 のタイプに基づいて別の階層になります。

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

私はいつでも言語間の翻訳を試みることができましたが、私は C# を初めて使用し、自分の仕事をしたいだけで、テンプレートとジェネリックの微妙な違いを学びたくないので、それを試すことはあまり好きではありません。

4

2 に答える 2

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>  {
    }    
}

これは私のニーズに合っています。

于 2011-07-19T19:06:03.713 に答える
0

Loki についてはわかりませんが、多重継承を使用しているようです。c# は多重継承をサポートしていません。私が長年 c# を使用して学んだことは、それを見逃さないということです。

于 2011-07-19T04:23:03.077 に答える