【发布时间】:2016-05-31 15:56:15
【问题描述】:
假设我们要创建一个帮助类来反转模板包,例如如下:
#include <tuple>
#include <utility>
#include <typeinfo>
#include <iostream>
template <class>
struct sizer;
template <template<class...> class Pack, class... Args>
struct sizer<Pack<Args...>> {
static constexpr size_t value = sizeof...(Args);
};
template <class Pack, class Indices = std::make_index_sequence<sizer<Pack>::value>>
struct reverse_pack;
template <class... Args, size_t... I>
struct reverse_pack<std::tuple<Args...>, std::integer_sequence<std::size_t, I...>> {
using type = typename std::tuple<typename std::tuple_element<(sizeof...(Args) - I - 1), std::tuple<Args...>>::type...>;
};
int main() {
std::cout << typeid(reverse_pack<std::tuple<int, float, double>>::type).name() << std::endl;
}
我们可以使用例如成功地做完全相同的事情。函数签名作为模板参数:
#include <utility>
#include <typeinfo>
#include <iostream>
template <class>
struct sizer;
template <class... Args>
struct sizer<void(Args...)> {
static constexpr size_t value = sizeof...(Args);
};
template <size_t N, class Sign>
struct nth_param;
template <size_t N, class First, class... Args>
struct nth_param<N, void(First, Args...)>: nth_param<N-1, void(Args...)> { };
template <class First, class... Args>
struct nth_param<0, void(First, Args...)> {
using type = First;
};
template <class Pack, class Indices = std::make_index_sequence<sizer<Pack>::value>>
struct reverse_pack;
template <class... Args, size_t... I>
struct reverse_pack<void(Args...), std::integer_sequence<std::size_t, I...>> {
using type = void(typename nth_param<(sizeof...(Args) - I - 1), void(Args...)>::type...);
};
int main() {
std::cout << typeid(reverse_pack<void(int, float, double)>::type).name() << std::endl;
}
我对@987654324@(例如here)的经验表明它旨在存储数据,而不是在模板之间传递类型包。那么使用元组对可变参数进行操作有什么实际理由吗?
【问题讨论】:
-
看一下这两个代码示例会发现长度减少了,因为不必重新创建
tuple_element。 -
函数参数类型可能不是数组,而元组元素类型可能是。
-
函数签名是错误的选择。它调整其参数,例如将函数调整为函数指针,删除常量等。
-
你还会用什么?
struct、class和union不允许您检查里面有哪些类型和数量。有时你可以使用pair,但这确实是一个专门的tuple。 -
开发人员倾向于使用
std::tuple,因为它带有开箱即用的tuple_element等功能。
标签: c++ templates tuples c++14 variadic-templates