c – 将int数组转换为可变参数模板
发布时间:2020-12-16 07:08:16 所属栏目:百科 来源:网络整理
导读:假设我有一个int数组,如int arr [N],并说arr [i]来自一个小域(例如1-10).假设我还有一个带有通用接口的可变模板类(抽象类) template int... Aclass FooImpl : public Foo{} 问题是我如何实现一个功能: Foo* getFoo(int arr[N]); 或者更好: Foo* getFoo(int
假设我有一个int数组,如int arr [N],并说arr [i]来自一个小域(例如1-10).假设我还有一个带有通用接口的可变模板类(抽象类)
template <int... A> class FooImpl : public Foo { } 问题是我如何实现一个功能: Foo* getFoo(int arr[N]); 或者更好: Foo* getFoo(int* pint,int size); 哪个会返回FooImpl,模板参数对应我的数组?例如,对于arr = {4,2,6,1},我会得到FooImpl< 4,1> 解决方法
我找到了问题的答案.诀窍是使用struct variadic模板而不是我最初尝试过的函数variadic模板.我使用带有func函数的_getFoo_impl结构,它逐个元素地构建.
假设元素在[1-5]范围内,大小< = 4,然后代码如下: class Foo { }; template <int...A> class FooImpl : Foo { }; template<int...As> struct _getFoo_impl { static Foo* func(int *arr,int sz) { if (sz == 0) return new FooImpl<As...>; switch (*arr) { case 1: return _getFoo_impl<As...,1>::func(arr + 1,sz - 1); case 2: return _getFoo_impl<As...,2>::func(arr + 1,sz - 1); case 3: return _getFoo_impl<As...,3>::func(arr + 1,sz - 1); case 4: return _getFoo_impl<As...,4>::func(arr + 1,sz - 1); case 5: return _getFoo_impl<As...,5>::func(arr + 1,sz - 1); default: throw "element out of range"; } } }; template<int A1,int A2,int A3,int A4,int A5> struct _getFoo_impl<A1,A2,A3,A4,A5> { static Foo* func(int*,int sz) { std::terminate(); } }; Foo* getFoo(int *arr,int size) { return _getFoo_impl<>::func(arr,size); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |