是否可以在给定无关输入的情况下生成非类型参数包?我的意思是,我想转此:
template <typename D, size_t... Offsets> struct VecGeneric;
template <typename N, size_t C> struct VecGenericData;
template <typename N, size_t D> struct TVecN;
template <typename N> struct TVecN<N,2> : public VecGeneric<VecGenericData<N,2>,0,1> { };
template <typename N> struct TVecN<N,3> : public VecGeneric<VecGenericData<N,3>,0,1,2> { };
template <typename N> struct TVecN<N,4> : public VecGeneric<VecGenericData<N,4>,0,1,2,3> { };
template <typename N> struct TVecN<N,5> : public VecGeneric<VecGenericData<N,5>,0,1,2,3,4> { };
template <typename N> struct TVecN<N,6> : public VecGeneric<VecGenericData<N,6>,0,1,2,3,4,5> { };
template <typename N> struct TVecN<N,7> : public VecGeneric<VecGenericData<N,7>,0,1,2,3,4,5,6> { };
// ...
这样的事情:
template <typename D, size_t... Offsets> struct VecGeneric;
template <typename N, size_t C> struct VecGenericData;
template <typename N, size_t D> struct TVecN : public VecGeneric<VecGenericData<N,D>,IntPack<D>...> { };
答案 0 :(得分:7)
构造给定0,1,2,...,N-1
的整数序列N
通常是递归地完成的;例如:
template<size_t... Is> struct index_sequence {};
namespace detail
{
template<size_t N, size_t... Is>
struct make_index_sequence_h
: make_index_sequence_h<N-1, N-1, Is...>
{};
template<size_t... Is>
struct make_index_sequence_h<0, Is...>
{
using type = index_sequence<Is...>;
};
}
template<size_t N>
using make_integer_sequence = typename detail::make_integer_sequence_h<N>::type;
(ÀlaC ++ 1y StdLib)
要使用这些整数,请从index_sequence
类型中推断出它们:
namespace detail
{
template<typename N, class IndexSequence>
struct helper;
template<typename N, size_t... Is>
struct helper<N, index_sequence<Is...>> // deduce the integers
{
using type = VecGeneric<VecGenericData<N, sizeof...(Is)>, Is...>;
};
}
以上是一个元函数,它将“计算”您想要派生的类型。 使用别名模板简化用法:
namespace detail
{
template<typename N, size_t D>
using helper_t = typename helper<N, make_index_sequence<D>>::type;
}
结果:
template <typename D, size_t... Offsets> struct VecGeneric
{
// just a quick test:
void print()
{
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
template <typename N, size_t C> struct VecGenericData {};
template <typename N, size_t D> struct TVecN : public detail::helper_t<N, D> {};
int main()
{
TVecN<int, 5>().print();
}