可变参数模板扩展期间的C ++索引类型

问题描述 投票:18回答:3

我有一个简单而又令人生畏的问题,我自己无法解决。我有类似的东西

template<class T, class... Args>
T* create(SomeCastableType* args, size_t numArgs)
{
  return new T(static_cast<Args>(args[INDEX_OF_EXPANSION])...);
}

假设SomeCastableType可以浇铸到任何类型。显然,我无法得到的是INDEX_OF_EXPANSION

非常感谢您的帮助。

c++ templates c++11 variadic-templates
3个回答
21
投票

gasxswpoi,春天〜

Indices trick

当然,我强烈建议使用template<class T, class... Args, std::size_t... Is> T* create(U* p, indices<Is...>){ return new T(static_cast<Args>(p[Is])...); } template<class T, class... Args> T* create(U* p, std::size_t num_args){ assert(num_args == sizeof...(Args)); return create<T, Args...>(p, build_indices<sizeof...(Args)>{}); } smart pointer而不是原始指针。


3
投票

你需要一个帮手:

std::vector

编辑:测试,似乎工作。


2
投票

假设#include <tuple> template <typename T, bool, typename Tuple, unsigned int ...I> struct helper { static T * go(S * args) { return helper<T, sizeof...(I) + 1 == std::tuple_size<Tuple>::value, Tuple, I..., sizeof...(I)>::go(args); } }; template <typename T, typename ...Args, unsigned int ...I> struct helper<T, true, std::tuple<Args...>, I...> { static T * go(S * args) { return new T(static_cast<Args>(args[I])...); } }; template <typename T, typename ...Args> T * create(S * args) { return helper<T, sizeof...(Args) == 0, std::tuple<Args...>>::go(args); } 可以浇铸到任何类型。显然,我无法得到的是SomeCastableType

从C ++ 14开始,你可以通过使用INDEX_OF_EXPANSION帮助程序来做@Xeo提到的with the support from the standard library索引,如下所示:

std::make_index_sequence
© www.soinside.com 2019 - 2024. All rights reserved.