强制模板成员函数实例化

布兰登

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

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

Ifor的值N::C::F<I>直到运行时才知道。但是,的值I受到限制,使得0 <= I < 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。有没有办法挽救这个问题,还是我必须求助于我的第一种骇人听闻的方法?

0x499602D2

您可以使用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...> { };

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

强制实例化所有模板类成员函数

来自分类Dev

强制clang为类模板实例化的从未引用静态成员函数发出代码

来自分类Dev

模板类成员函数实例化

来自分类Dev

静态模板成员函数的实例化?

来自分类Dev

从未模板化类的模板化成员函数实例化模板化类

来自分类Dev

跨DLL的C ++成员函数显式模板实例化

来自分类Dev

内联函数体的潜力评估和模板成员的实例化

来自分类Dev

如何删除成员函数模板的实例化?

来自分类Dev

跨DLL的C ++成员函数显式模板实例化

来自分类Dev

成员函数实例化

来自分类Dev

类模板的成员函数的显式实例化声明是否导致类模板的实例化?

来自分类Dev

实例化错误后成员函数模板的特化和成员函数的顺序

来自分类Dev

实例化错误后成员函数模板的特化和成员函数的顺序

来自分类Dev

类模板的所有实例化可以共享相同的模板独立成员函数吗?

来自分类Dev

具有布尔模板参数的成员函数的显式模板实例化

来自分类Dev

实例化类型模板类的非类型模板成员函数

来自分类Dev

模板静态成员变量的实例化

来自分类Dev

引用数据成员到模板的实例化

来自分类Dev

模板函数重载的实例化

来自分类Dev

实例化模板是否实例化其静态数据成员?

来自分类Dev

具有未定义的成员函数返回类型的模板实例化

来自分类Dev

如果从未调用,则不会实例化类模板的成员函数?

来自分类Dev

在显式实例化的情况下,可以内联类模板的成员函数吗?

来自分类Dev

如果从不调用类模板的成员函数,是否不会实例化?

来自分类Dev

定义函数模板实例的std :: function指针时出错,它是模板化类的成员吗?

来自分类Dev

实例化类时是否实例化了类模板的成员?

来自分类Dev

如何专门化模板成员函数?

来自分类Dev

模板成员函数专门化

来自分类Dev

模板类-成员函数专门化

Related 相关文章

  1. 1

    强制实例化所有模板类成员函数

  2. 2

    强制clang为类模板实例化的从未引用静态成员函数发出代码

  3. 3

    模板类成员函数实例化

  4. 4

    静态模板成员函数的实例化?

  5. 5

    从未模板化类的模板化成员函数实例化模板化类

  6. 6

    跨DLL的C ++成员函数显式模板实例化

  7. 7

    内联函数体的潜力评估和模板成员的实例化

  8. 8

    如何删除成员函数模板的实例化?

  9. 9

    跨DLL的C ++成员函数显式模板实例化

  10. 10

    成员函数实例化

  11. 11

    类模板的成员函数的显式实例化声明是否导致类模板的实例化?

  12. 12

    实例化错误后成员函数模板的特化和成员函数的顺序

  13. 13

    实例化错误后成员函数模板的特化和成员函数的顺序

  14. 14

    类模板的所有实例化可以共享相同的模板独立成员函数吗?

  15. 15

    具有布尔模板参数的成员函数的显式模板实例化

  16. 16

    实例化类型模板类的非类型模板成员函数

  17. 17

    模板静态成员变量的实例化

  18. 18

    引用数据成员到模板的实例化

  19. 19

    模板函数重载的实例化

  20. 20

    实例化模板是否实例化其静态数据成员?

  21. 21

    具有未定义的成员函数返回类型的模板实例化

  22. 22

    如果从未调用,则不会实例化类模板的成员函数?

  23. 23

    在显式实例化的情况下,可以内联类模板的成员函数吗?

  24. 24

    如果从不调用类模板的成员函数,是否不会实例化?

  25. 25

    定义函数模板实例的std :: function指针时出错,它是模板化类的成员吗?

  26. 26

    实例化类时是否实例化了类模板的成员?

  27. 27

    如何专门化模板成员函数?

  28. 28

    模板成员函数专门化

  29. 29

    模板类-成员函数专门化

热门标签

归档