加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读