【问题标题】:Templating off of an arbitirary-length list of types in C++在 C++ 中对任意长度的类型列表进行模板化
【发布时间】:2010-02-24 04:58:04
【问题描述】:

这是我希望能够输入的内容:

class foo : public watchKeys<A, B, C> {}; //Or any list of keys

Boost::mpl 有序列,可以让你这样做,但我不想这样做:

class foo : public watchKeys<mpl::list<A, B, C> > {};

我不介意它内部“丑陋”或冗长,但我希望 watchKeys 的最终使用方式非常简单和直观。我也不知道 boost 是如何做到的,但这似乎是因为我和模板之间有一层宏。

我该怎么办?我更希望 为每种类型的类型制作巨大的模板列表,但如果这是唯一的,那就是唯一的方法......

编辑:我已经相当确定没有办法做我想做的事(几乎,但你不能有可变数量的宏参数),但问题仍然在产生有用和信息丰富的答案。

【问题讨论】:

    标签: templates metaprogramming typelist boost-mpl


    【解决方案1】:

    每种类型的巨大模板列表是在当前版本的 C++ 中实现此目的的唯一方法。有关如何进行的示例,请参见 boost::tuple。

    C++0X 支持variadic templates,但还没有得到很好的支持(我认为现代版本的 GCC 有实验性支持)。

    【讨论】:

    【解决方案2】:

    或者你可以递归地做到这一点

    template<typename Head, typename Tail>
    struct list { };
    
    struct emptylist { };
    
    class foo : public watchKeys<list<A, 
                                 list<B, 
                                 list<C, emptylist> > > > { };
    

    然后你可以像这样处理它

    template<typename List>
    struct process;
    
    template<typename Head, typename Tail>
    struct process< list<Head, Tail> > : process<Tail> { 
      // process Head
    };
    
    template<>
    struct process<emptylist> { };
    

    【讨论】:

    • 虽然漂亮(以及模板元编程的一个方便示例)部分所需的解决方案是一个优雅的用例,但这不匹配。
    • @Narfanator,对不起,我不明白你的评论。你的意思是list&lt;A, list&lt;B, emptylist&gt; &gt; 的语法不是我们想要的解决方案吗?
    • 是的,完全正确。以自己的方式进行操作更直观,但在不增加清晰度的情况下会更加冗长。
    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 2022-11-13
    • 2019-09-21
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2018-12-05
    • 2012-01-24
    相关资源
    最近更新 更多