繁体   English   中英

类型推导给定成员函数指针与可变参数模板

[英]Type deduction given member function pointer with variadic templates

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

 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM