c++ - 用于多个组件的索引技巧

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

考虑这个完整的工作代码:

#include <type_traits>

template <typename T, typename IndexPack> struct Make;

template <typename T, template <T...> class P, T... Indices>
struct Make<T, P<Indices...>> {
    using type = P<(Indices+1)..., (-3*Indices)..., (Indices-1)...>;
};

template <int...> class Pack;

int main() {
    static_assert (std::is_same<Make<int, Pack<1,2,3,4>>::type, 
        Pack<2,3,4,5, -3,-6,-9,-12, 0,1,2,3>>::value, "false");
}

我真正想要的输出是

Pack<2,-3,0, 3,-6,1, 4,-9,2, 5,-12,3>

而不是 Pack<2,3,4,5, -3,-6,-9,-12, 0,1,2,3> .我第一次尝试

using type = P<(Indices+1, -3*Indices, Indices-1)...>;

但是编译器将其简单地理解为无用的逗号运算符。获得我想要的东西所需的语法是什么?如果没有这样的语法,最干净的方法是什么,请记住使用 Indices 3 次只是一个例子(我们可能想使用它超过 3 次)。请不要告诉我我必须编写一个帮助程序来提取单个包,然后“交错”所有元素。这种噩梦般的方法不可能是最好的解决方案(而且这种解决方案也只有在我们确切知道要提取多少包的情况下才有效)。

会定义

template <typename T, template <T...> class P, T I>
struct Component {
    using type = P<I+1, -3*I, I-1>;
};

有什么帮助吗?对此进行包扩展?

最佳答案

是的,你可以递归地连接:

template <typename, typename, typename> struct Concat;

template <typename T, template <T...> class P, T... A, T... B>
struct Concat<T, P<A...>, P<B...>> {
    using type = P<A..., B...>;
};

template <typename T, typename IndexPack> struct Make;

template <typename T, template <T...> class P, T... I, T F >
struct Make<T, P<F, I...>> {
    using type = typename Concat<T,
                                 typename Make<T, P<F>>::type,
                                 typename Make<T, P<I...>>::type>::type;
};

template <typename T, template <T...> class P, T I>
struct Make<T, P<I>> {
    using type = P<I+1, -3*I, I-1>;
};

Demo

关于c++ - 用于多个组件的索引技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29907927/

相关文章:

c++ - 在调用过程中删除 std::function

c++ - 将字符 vector 转换为字符串的最快方法

c++ - 在 C++ 中进行简单算术运算时遇到问题

c++ - 如何更改另一个 qml 文件的标签文本?

c++ - 如何修复通过重载和模板化的插入运算符尝试显示字符串对象数组而产生的空白输出?

java - 用于文本模板的高效 java 库?

c++ - Eigen ConditionType数组:一种有效的广播方式,而不是循环

c++ - 命名构造函数习语和模板?

c++ - 简单的复制和 move 操作有什么不同吗?

c++ - 字符串流的部分拷贝