C# Typelist 类似于带有层次结构生成器的 Loki::Typelist

发布于 2024-11-24 17:17:44 字数 1114 浏览 3 评论 0原文

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

I loved Loki's C++ HierarchyGenerator and want to do the same in C#.

What I want in the end is a class that has a virtual function per argument in a given typelist.

C++ code I'd like to convert:

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

in C#. If you aren't familiar with Loki, the FooSend class above would default to:

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

But when a new TList is given, it'd be a different Hierarchy based on the Types in the TList.

I'm also interested in a GenLinearHierarchy in Loki if it exists out there.

I could always try to translate between the languages, but I'm not a big fan of trying that as I'm new to C# and just want to do my work, not learn the subtle difference between templates and generics.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

李不 2024-12-01 17:17:44

我不知道 Loki,但我觉得你使用了多重继承。
c# 不支持多重继承,而我在使用 c# 多年中学到的是,我不会错过它。

I have no idea of Loki but it looks for me that you use multiple inheritance.
c# does not support multiple inheritance and what I have learned many years working with c# is that I do not miss it.

最笨的告白 2024-12-01 17:17:44

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

这符合我的需要。

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

I can't get the formatting the way I'd like (and, regardless, the t4 formatting is always going to be ugly), but this solves my problem.

The code above produces:

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

Which fits my needs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文