首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颠倒模板(整型)参数的顺序

颠倒模板(整型)参数的顺序
EN

Stack Overflow用户
提问于 2018-05-13 17:14:35
回答 1查看 111关注 0票数 0

根据在a previous thread中找到的答案,我正在尝试颠倒模板可变std::size_t参数序列的顺序。但由于某些原因,它不起作用。

下面是一个常规的可变打印函数:

代码语言:javascript
复制
template<typename = void>
void print(void)
{
    std::cout << std::endl;
}

template<typename... T>
void print(std::size_t index, T... indexes)
{
    std::cout << index << ' ';
    print(indexes...);
}

下面是模板类链:

代码语言:javascript
复制
template<std::size_t... Indexes>
class NonRecursiveClass
{
    public:

        void show(void)
        {
            print(Indexes...);
        }
};

template<std::size_t Count, std::size_t Index, std::size_t... Indexes>
class RecursiveClass;

template<std::size_t Count, std::size_t Index, std::size_t... Indexes>
class RecursiveClass : public RecursiveClass<Count - 1u, Indexes..., Index>
{
};

template<std::size_t Index, std::size_t... Indexes>
class RecursiveClass<0u, Index, Indexes...> : public NonRecursiveClass<Index, Indexes...>
{
};

基本上,如果您创建了一个RecursiveClass<5u, 10u, 1u, 6u, 478u, 23u>对象,它将继承一个NonRecursiveClass<23u, 478u, 6u, 1u, 10u>对象,并且在编译时向后返回您的std::size_t参数序列。

不幸的是,当我尝试它的时候,我仍然得到了原始的订单。下面是我的主要函数:

代码语言:javascript
复制
int main(void)
{
    RecursiveClass<5u, 10u, 1u, 6u, 478u, 23u> foo;
    foo.show();
    return 0;
}

下面是输出:

代码语言:javascript
复制
10 1 6 478 23

我做错什么了?

EN

回答 1

Stack Overflow用户

发布于 2018-05-13 23:24:53

我做错了什么?

想一想你在这里做什么:

代码语言:javascript
复制
template<std::size_t Count, std::size_t Index, std::size_t... Indexes>
class RecursiveClass : public RecursiveClass<Count - 1u, Indexes..., Index>

如果还没有完成(也就是说,如果是Count != 0),那么您要做的就是将第一个放在后面。让我们先来看看这个算法:

代码语言:javascript
复制
RecursiveClass<5, 10, 1, 6, 478, 23>
└─ RecursiveClass<4, 1, 6, 478, 23, 10> // 10 to the back
   └─ RecursiveClass<3, 6, 478, 23, 10, 1> // 1 to the back
      └─ RecursiveClass<2, 478, 23, 10, 1, 6> // 6 to the back
         ...

我们不会颠倒顺序。我们只是把它旋转了一整圈。这就是为什么我们最终会打印同样的东西。

您需要做的是将每个元素预先挂起到一个不同的序列:

代码语言:javascript
复制
template <std::size_t...> struct sequence;

template <typename T, typename U>
class RecursiveClassImpl;

template <std::size_t I, std::size_t... Is, std::size_t... Js>
class RecursiveClassImpl<sequence<I, Is...>, sequence<Js...>>
    : public RecursiveClassImpl<sequence<Is...>, sequence<I, Js...>>
//                                               ^^^^^^^^^^^^^^^^^^
//                                               NB: prepend
{ };

template <std::size_t... Js>
class RecursiveClassImpl<sequence<>, sequence<Js...>>
    : public NonRecursiveClass<Js...>
{ };

template<std::size_t... Indexes>
class RecursiveClass : public RecursiveClassImpl<sequence<Indexes...>, sequence<>>
{ };
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50314542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档