ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 强制模板成员函数实例化

2019-08-24 11:08:37  阅读:182  来源: 互联网

标签:c c11 templates instantiation


我在命名空间N中有一个C类,它有一个公共模板成员函数F,如下所示:

namespace N {
    class C {
    public:
        template<int I>
        void F() {
            // ...
        }
    };
};

N :: C :: F< I>的I值.直到运行时才知道.然而,I的值受到约束,使得0 <= I <1. 2 ^ 8.我正在寻找一种方法来强制此功能将模板扩展为所有256种可能的形式. 到目前为止,我已经在C的第二个函数中手动创建了一个静态数组,指向每个可能的函数:

        template<int I>
        void F() {
            // ...
        }

        void G(int I) {
            static void(* const funcs[256])() = {
                F<0>, F<1>, F<2>, ...
            };

            funcs[I]();
        }

虽然我想知道是否有更好的方法.我已经在N中有一个宏,它负责为I的每个值构建一个单独的结构(供F本身使用),并且看看我是否可能以某种方式集成模板成员函数的实例化:

    template<int> struct S;

    #define M(I, n) \
        template<> struct S<I> { \
            static const char name[] = #n; \
            /*
                Some how instantiate the function here, like (just guessing here):

                static const SEvaluator<I> eval = &C::F<I>;

                given

                template<int I>
                using SEvaluator = void(*)();
            */
        };

    M(0, "foo"); M(1, "bar");

    #undef M

我提出的方法不能正常工作,编译器抱怨F不是constexpr. F操纵C的几个变量并调用外部方法,不能声明为constexpr.有没有办法挽救这个或者我是否必须采用我的第一个hackish方法?

解决方法:

您可以使用index_sequence< I ...> (C 14)并将I展开为静态数组.

template<std::size_t... Is>
void G(int i, std::index_sequence<Is...>) {
    using C = void(C::*)();
    static C funcs[sizeof...(Is)] = { &C::F<Is>... };
    (this->*funcs[i])();
}

void G(int i) {
    G(i, std::make_index_sequence<256>());
}

对于非C 14解决方案,您可以编写自己的index_sequence版本:

template<int... Is>
struct index_sequence { };

template<int N, int... Is>
struct make_index_sequence : make_index_sequence<N - 1, N - 1, Is...> { };

template<int... Is>
struct make_index_sequence<0, Is...> : index_sequence<Is...> { };

标签:c,c11,templates,instantiation
来源: https://codeday.me/bug/20190824/1707183.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有