我有一个简单而又令人生畏的问题,我自己无法解决。我有类似的东西
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
。
非常感谢您的帮助。
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而不是原始指针。
你需要一个帮手:
std::vector
编辑:测试,似乎工作。
假设
#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