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