gpt4 book ai didi

c++ - 如何在编译时交换可变参数模板的两个参数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:34 27 4
gpt4 key购买 nike

我试图在编译时交换可变参数模板的两个参数:

 template<int...Numbers>struct sequence{};

template<size_t first,size_t second>
struct Swap_Pair
{
const static size_t First = first;
const static size_t Second = second;
};

template <int...Numbers,class swap_pair>
struct Swap_Data
{
static std::array<int, sizeof...(Numbers)> data_;//How to swap Numbers base on the pair and store it in data_ ?
};

用例应该是:

sequence<1, 2, 3, 4, 5, 6> array;
auto result = Swap_Data < array, Swap_Pair<2, 5> > ::data_;
//result is now std::array which contains 1 2 6 4 5 3

我不知道什么是编写 Swap_Data 的正确方法。

我如何进行递归交换以交换可变参数并在编译时转换为 std::array?

最佳答案

我在评论中发布的链接是我自己实现的类似 std::bind() 的元函数元函数。

我所做的是将 bind 调用参数从它的值(一个值或占位符)转换为一个值,或由该占位符表示的值。

在您的情况下,您可以尝试类似的方法:将占位符(传递给交换的值)的序列映射到序列的相应值。像这样的东西:

template<std::size_t I>
struct placeholder{};

using _1 = placeholder<0>;
... //More placeholder aliases

template<typename SEQ , typename... PLACEHOLDERS>
struct swap;

template<std::size_t... Is , std::size_t... Ps>
struct swap<sequence<Is...>,placeholder<Ps>...>
{
template<typename PLACEhOLDER>
struct transformation;

template<std::size_t I>
struct transformation<placeholder<I>>
{
static constexpr const std::size_t result = get<sequence<Is...>,I>::value;
};

using result = map<transformation,sequence<Is...>>;
};

其中 map 是一个类似于 std::transform() 的元函数(非常容易编写),而 get 是一个元函数,它检索序列的第 I 个元素(也很简单)。

可以这样使用:

 using swapped = typename swap<sequence<1,2,3>,_3,_2,_1>::result; //swapped is sequence<3,2,1>

关于c++ - 如何在编译时交换可变参数模板的两个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24161611/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com