LxL*_*LxL 6 c++ templates metaprogramming variadic-templates c++11
我正在尝试在编译时交换可变参数模板的两个参数:
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_ ?
};
Run Code Online (Sandbox Code Playgroud)
用例应该是:
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
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚什么是正确的写作方式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...>>;
};
Run Code Online (Sandbox Code Playgroud)
哪个map是类似于std::transform()(非常容易编写)get的元函数,以及一个检索序列的第I个元素的元函数(也很容易).
这可以通过这种方式使用:
using swapped = typename swap<sequence<1,2,3>,_3,_2,_1>::result; //swapped is sequence<3,2,1>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
357 次 |
| 最近记录: |