将静态成员函数作为模板参数传递

维托里奥·罗密欧(Vittorio Romeo)
template<typename T> struct A 
{
    static T x(T, T) { }
    static T y(T, T) { }
};

template<typename T> struct B 
{
    static T x(T, T) { }
    static T y(T, T) { }
};

struct Dispatcher
{
    template<template<typename> class TC, ??? TStaticFunc, 
             typename T1, typename T2> 
    static std::common_type_t<T1, T2> call(T1 mI, T2 mJ)
    {
        return TC<std::common_type_t<T1, T2>>::*TStaticFunc(mI, mJ);
    }
};

Dispatcher::call<A, x>(12.f, 5);
Dispatcher::call<B, x>(1.f, 51);
Dispatcher::call<A, y>(2.f, 25);
Dispatcher::call<B, y>(5.f, 3);

是否可以创建一个像这样的模板化函数Dispatcher::call我想分别传递类类型和静态函数名称。

还是通过A<..:>::x实现这种调度的唯一可能方法?

斯塔罗尔

好吧,如果您确实想要,那么您可以做到。您只需要为每个静态函数名称定义类型,函数或变量(基本上是一些编译时唯一的变量)。该选项之一:

namespace detail
{
    template <typename T>
    struct x
    {
        static decltype(&T::x) get() { return &T::x; }
    };

    template <typename T>
    struct y
    {
        static decltype(&T::y) get() { return &T::y; }
    };

    // etc, you can use macros here to avoid boilerplate
}

现在Dispatcher稍微改变一下...

struct Dispatcher
{
    template<template<typename> class TC, template<typename> class FuncGetter,
        typename T1, typename T2> 
        static typename std::common_type<T1, T2>::type call(T1 mI, T2 mJ)
    {
        typedef TC<typename std::common_type<T1, T2>::type> T;
        auto staticMemberFunc = FuncGetter<T>::get();
        return staticMemberFunc(mI, mJ);
    }
};

现在下面的代码:

using namespace detail;
Dispatcher::call<A, x>(12.f, 5);
Dispatcher::call<B, x>(1.f, 51);
Dispatcher::call<A, y>(2.f, 25);
Dispatcher::call<B, y>(5.f, 3);

作品。如果您决定遵循此模式,则建议您按照这些原则进行更改,x然后更改yx_tag或。

另外,您也可以编写要使用的宏,而不是Dispatcher::call

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将静态成员函数作为模板参数传递

来自分类Dev

如何将非静态成员函数作为模板参数传递给另一个成员函数?

来自分类Dev

将非静态成员函数作为参数传递给成员函数

来自分类Dev

将模板类作为类成员函数内的模板模板参数传递

来自分类Dev

将模板类/结构的成员函数地址作为函数参数传递

来自分类Dev

将成员函数作为参数传递给函数模板

来自分类Dev

将成员函数指针作为参数传递给模板方法

来自分类Dev

将指向成员函数参数的指针传递给模板参数

来自分类Dev

C ++将指向成员的指针作为模板参数传递

来自分类Dev

将PARENT类的成员名称作为模板参数传递

来自分类Dev

将类成员函数作为参数传递给全局函数

来自分类Dev

将指针传递给成员函数作为void *函数的参数

来自分类Dev

将模板函数作为普通函数的参数传递

来自分类Dev

将模板函数和重载作为函数参数传递

来自分类Dev

C++静态模板类成员作为朋友模板函数默认参数

来自分类Dev

传递模板的模板成员类型作为模板模板参数

来自分类Dev

传递模板的模板成员类型作为模板模板参数

来自分类Dev

将函数模板原型作为参数传递

来自分类Dev

将函数作为参数传递给模板返回值

来自分类Dev

如何将函数指针作为类模板参数传递?

来自分类Dev

如何将谓词函数作为模板参数传递?

来自分类Dev

将函数作为类型未知的类的模板参数传递

来自分类Dev

将函数模板原型作为参数传递

来自分类Dev

将继承的模板结构作为函数参数传递

来自分类Dev

将函数指针作为非类型模板参数传递

来自分类Dev

如何将模板作为参数传递给函数

来自分类Dev

如何传递具有可变参数作为模板参数的成员函数?

来自分类Dev

如何使用函数指针作为参数初始化模板的静态成员

来自分类Dev

ref合格的成员函数作为模板参数?

Related 相关文章

  1. 1

    将静态成员函数作为模板参数传递

  2. 2

    如何将非静态成员函数作为模板参数传递给另一个成员函数?

  3. 3

    将非静态成员函数作为参数传递给成员函数

  4. 4

    将模板类作为类成员函数内的模板模板参数传递

  5. 5

    将模板类/结构的成员函数地址作为函数参数传递

  6. 6

    将成员函数作为参数传递给函数模板

  7. 7

    将成员函数指针作为参数传递给模板方法

  8. 8

    将指向成员函数参数的指针传递给模板参数

  9. 9

    C ++将指向成员的指针作为模板参数传递

  10. 10

    将PARENT类的成员名称作为模板参数传递

  11. 11

    将类成员函数作为参数传递给全局函数

  12. 12

    将指针传递给成员函数作为void *函数的参数

  13. 13

    将模板函数作为普通函数的参数传递

  14. 14

    将模板函数和重载作为函数参数传递

  15. 15

    C++静态模板类成员作为朋友模板函数默认参数

  16. 16

    传递模板的模板成员类型作为模板模板参数

  17. 17

    传递模板的模板成员类型作为模板模板参数

  18. 18

    将函数模板原型作为参数传递

  19. 19

    将函数作为参数传递给模板返回值

  20. 20

    如何将函数指针作为类模板参数传递?

  21. 21

    如何将谓词函数作为模板参数传递?

  22. 22

    将函数作为类型未知的类的模板参数传递

  23. 23

    将函数模板原型作为参数传递

  24. 24

    将继承的模板结构作为函数参数传递

  25. 25

    将函数指针作为非类型模板参数传递

  26. 26

    如何将模板作为参数传递给函数

  27. 27

    如何传递具有可变参数作为模板参数的成员函数?

  28. 28

    如何使用函数指针作为参数初始化模板的静态成员

  29. 29

    ref合格的成员函数作为模板参数?

热门标签

归档