在可变参数模板中交换两个参数

时间:2017-09-07 23:00:34

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

我试图交换参数包的两个项目。

理想情况下,我想做这样的事情:

render()

有什么想法吗?

非常感谢。

1 个答案:

答案 0 :(得分:8)

您可以使用std::tuple打包args并按索引解压缩,使用std::index_sequence生成要使用的索引。然后,这只是在索引上进行交换的问题。像这样:

namespace swapped_copy_detail {
    constexpr std::size_t swap_one_index(
        std::size_t i1, std::size_t i2, std::size_t index) {
        return index==i1 ? i2 : (index==i2 ? i1 : index);
    }

    template <std::size_t i1, std::size_t i2, class Tuple, std::size_t... Inds>
    void do_swapped_copy(
        some_class& a, some_class& b,
        Tuple&& args,
        std::index_sequence<Inds...> inds ) {
        a(std::get<Inds>(args)...) =
            b(std::get<swap_one_index(i1, i2, Inds)>(args)...);
    }
}

template <std::size_t i1, std::size_t i2, class ...Args>
void swapped_copy(some_class a, some_class b, const Args& ...args) {
    static_assert(i1 < sizeof...(Args) && i2 < sizeof...(Args),
                  "Index too large for swapped_copy");
    swapped_copy_detail::do_swapped_copy<i1, i2>(
        a, b, std::tie(args...),
        std::index_sequence_for<Args...>());
}

index_sequenceindex_sequence_for符合C ++ 14标准,但您的问题已标记为[c ++ 11]。如果您需要坚持使用C ++ 11,可以在this answer中找到这些实用程序的实现,一个地方。