代码之家  ›  专栏  ›  技术社区  ›  Adrian Lis

具有可变模板的给定成员函数指针的类型推导

  •  7
  • Adrian Lis  · 技术社区  · 11 年前

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

     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
    
    1 回复  |  直到 11 年前
        1
  •  7
  •   Community CDub    8 年前

    你至少需要一个助手和类似的东西 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;
    

    Live example


    作为用户 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;