【问题标题】:Iterating variadic template arguments in reverse order以相反的顺序迭代可变参数模板参数
【发布时间】:2012-02-05 02:28:00
【问题描述】:

如果我手动反转传递给它的模板参数的顺序,则以下代码可以工作:

template<typename HeadTag, typename... TailTag>
struct Mapped_scope_deep : public Mapped_scope_deep<TailTag...> {
    typedef typename boost::mpl::at<typename Mapped_scope_deep<TailTag...>::type::type_map,
                                    HeadTag>::type type;
};

template<typename HeadTag>
struct Mapped_scope_deep<HeadTag> {
    typedef typename boost::mpl::at<type_map, HeadTag>::type type;
};

例子:

// typename Mapped_scope_deep<T0, T1, T2, T3>::type
// needs to be written as
typename Mapped_scope_deep<T3, T2, T1, T0>::type

我已尝试在此处解决此问题:

template<typename map, typename HeadTag, typename... TailTag>
struct Mapped_scope_deep_r :
    public Mapped_scope_deep_r< typename boost::mpl::at<map, HeadTag>::type::type_map, TailTag...> {
  typename Mapped_scope_deep_r< typename boost::mpl::at<map, HeadTag>::type::type_map, TailTag...>::type type;
};

template<typename map, typename HeadTag>
struct Mapped_scope_deep_r<map, HeadTag> {
    typedef typename boost::mpl::at<map, HeadTag>::type type;
};

template<typename... Tags>
struct Mapped_scope_deep3 :
    public Mapped_scope_deep_r<type_map, Tags...> {
    typedef typename Mapped_scope_deep_r<type_map, Tags...>::type type;
};

例子:

typename Mapped_scope_deep<T0, T1, T2, T3>::type

但这会导致编译错误:

./compressed_enums.hxx:197:66: error: typename specifier refers to non-type member 'type' in 'Gamblify::Asdf<unsigned char, CAT>::Mapped_scope_deep_r<boost::mpl::map<boost::mpl::pair<Cat, Gamblify::Category2<unsigned char, 1, Cat, B_First, TagA_array_2, B_Second> > >, Cat, First>'
    typedef typename Mapped_scope_deep_r<type_map, Tags...>::type type;
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~

我做错了什么,他们是不是以相反的顺序进行类似折叠操作的更简单方法?

【问题讨论】:

    标签: c++ c++11 variadic-templates


    【解决方案1】:

    您在Mapped_scope_deep_r 中缺少typedef。这一行声明了一个对象,而不是一个类型:

    typename Mapped_scope_deep_r< typename boost::mpl::at<map, HeadTag>::type::type_map, TailTag...>::type type;
    

    至于颠倒一个包的顺序,有一些肮脏的技巧,但最好的方法是定义一个元函数tuple_reverse,并用它来过滤模板的输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2013-04-01
      • 2017-08-29
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多