使用可变参数模板的任意数量的方法指针

时间:2015-06-04 19:29:27

标签: c++ templates c++11 variadic-templates member-function-pointers

我正在尝试使用一个可变参数模板类,它应该包含任意数量的方法指针,也就是方法指针的编译时列表。我的目标是实现这样的目标:

struct SomeType : Invoke<&SomeType::foo, &SomeType::bar> {
    int foo(int i);
    double bar(double a, double b);
};

但是,为了接受具有不同参数和返回类型的任意数量的方法,我提出了这个:

template<typename T, T m>
struct Method;

template<typename R, typename T, typename... Args, R(T::f*)(Args...)>
struct Method<R(T::*)(Args...), f> {
    constexpr static auto method = f;
};

它有效,但它迫使我使用这种语法:

struct SomeType : Invoke<Method<decltype(&SomeType::foo), &SomeType::foo>, Method<decltype(&SomeType::bar), &SomeType::bar>> {
    int foo(int i);
    double bar(double a, double b);
};

将Invoke作为此类:

template<typename... T>
struct Invoke;

template<typename First, typename... Others>
struct Invoke<First, Others...> : Invoke<Others...> {
    constexpr static auto method = First = First::method;
    using Next = Invoke<Others...>
};

template<>
struct Invoke<> {};

要摆脱decltype(),我找到的唯一方法是无效的C ++,但它会是:

template<T f, typename T>
struct Method;

因此编译器会猜测f的类型。

如何更接近第一个代码段中的语法?什么是像INVOKE(&SomeType::foo)一样使用的宏的例子,并将扩展为代码Invoke<Method<decltype(&SomeType::foo), &SomeType::foo>>

0 个答案:

没有答案