C# Typelist 类似于 Loki::Typelist 与层次结构生成器

Posted

技术标签:

【中文标题】C# Typelist 类似于 Loki::Typelist 与层次结构生成器【英文标题】:C# Typelist analog to Loki::Typelist with Hierarchy Generator 【发布时间】:2011-10-08 04:37:13 【问题描述】:

我喜欢 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# 新手,只是想做我的工作,而不是了解模板和泛型之间的细微差别。

【问题讨论】:

【参考方案1】:

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

这符合我的需要。

【讨论】:

【参考方案2】:

我不知道 Loki,但它看起来你使用多重继承。 c# 不支持多重继承,我多年使用 c# 学到的是我不会错过它。

【讨论】:

LinearHierarchy 不是多重继承(它是一行继承——在上面的例子中,它是FooSend : FooSend&lt;Sender&lt;1&gt; &gt;,其中FooSend&lt;Sender&lt;1&gt; &gt; : FooSend&lt;Sender&lt;2&gt; &gt; 但是 C#y 执行 ScatterHierarchy 的方法是拥有上述所有内容,但使用 SenderV&lt;Foo&lt;1&gt; &gt;SenderV&lt;Foo&lt;2&gt; &gt; 的接口代替类继承。重点是将一个类描述为Foo&lt;1&gt; 类型的“发送者”——Foo&lt;n&gt; 我希望有大约 20 个类(Foo&lt;1&gt;Foo&lt;20&gt;)我想放入 TypeList,并且我希望有一些遵循这种模式的类,它们都有稍微不同的类型列表(可合并),所以并不是纯粹的懒惰把我推向这条路线。

以上是关于C# Typelist 类似于 Loki::Typelist 与层次结构生成器的主要内容,如果未能解决你的问题,请参考以下文章

为 TypeList 实现 Loki IndexOf

与 C# 相比,Java 的 final 类似于 const 或 readonly [重复]

C#:有啥方法可以抑制编译器错误,类似于抑制警告消息?

查找所有实现 C# 接口的类 - 类似于 Java [重复]

宏调用中的 #ifdef 适用于 gcc,但不适用于 msvc

C# 的频谱分析器,类似于 Winamp? [关闭]