使用可变参数模板键入给定成员函数指针的类型推导

Type deduction given member function pointer with variadic templates

本文关键字:函数 成员 指针 类型 变参 参数      更新时间:2023-10-16

>假设我有一个成员函数指针,我如何编写自动推断给定模板签名参数的代码:

 template<typename T> class Foo {};
 template<typename R, typename C, typename... A>
 class Foo<R(C, A...)> { };

对于 C 和 R,没有问题,因为类似的东西可以解决问题:

template<typename R, typename C, typename... A> 
R deduce_R_type(R(C::*)(A...));
template<typename R, typename C, typename... A>
C deduce_C_type(R(C::*)(A...));

然后我实际上可以将其插入 Foo 实例化,但如何推断来自模板可变参数部分的类型?

Foo<
decltype(deduce_R_type(&SomeClass::SomeFunction)) (
decltype(deduce_C_type(&SomeClass::SomeFunction)), ___ ??? ___)> instance

你至少需要一个助手和类似 std::tuple

template<typename R, typename C, typename... A>
std::tuple<A...> deduce_A_tuple(R(C::*)(A...));
template<typename R, typename C, typename T>
struct FooHelper;
template<typename R, typename C, typename... A>
struct FooHelper< R, C, std::tuple<A...> >
{
    typedef Foo< R( C, A... ) > type;
};

然后您可以使用:

FooHelper< decltype(deduce_R_type(&SomeClass::SomeFunction)),
           decltype(deduce_C_type(&SomeClass::SomeFunction)), 
           decltype(deduce_A_tuple(&SomeClass::SomeFunction)) >::type instance;

现场示例


正如用户 DyP 指出的那样,无论如何,当您必须使用助手时,它可能会简单得多:

template<typename>
struct FooHelper;
template<typename R, typename C, typename... A>
struct FooHelper< R (C::*)(A...) >
{
    using type = Foo< R( C, A... ) >;
};

并将其用作

FooHelper< decltype(&SomeClass::SomeFunction) >::type instance;