C++11 使用参数包推断函数参数类型

C++11 使用参数包推断函数参数类型,c++11,variadic-templates,variadic-functions,C++11,Variadic Templates,Variadic Functions,我试图使用指向成员函数指针和参数包的指针调用函数。以下是代码: class DemoClass { public: void Printer(const DemoClass& sc, const int& i) { } }; template<typename R, typename T, typename ... Args/*, typename ... Params*/> void MakeMemberActionDemoClass(R(T::

我试图使用指向成员函数指针和参数包的指针调用函数。以下是代码:

class DemoClass {
public:
   void Printer(const DemoClass& sc, const int& i) {
   }
};



 template<typename R, typename T, typename ... Args/*, typename ... Params*/>
void MakeMemberActionDemoClass(R(T::*memberFunction)(Args...), Args&& ... args) 
{
}

int main()
{
    DemoClass d;
    int z;
    MakeMemberActionDemoClass(&DemoClass::Printer, d, z);
}
如果我删除MakeMemberActionDemoClass的最后一个参数中的&&则唯一的错误区别如下:

1>          could be 'const DemoClass&, const int&'
1>          or       'DemoClass, int'
我应该怎么做才能正确推断参数类型


提前感谢,

两个
Args
实例都处于可推断的上下文中。它们必须生成相同的类型,否则编译器会抱怨它不明确

一种方法是在一种或另一种上下文中阻止演绎。另一种方法是停止连接它们

template<class T>struct tag_t{using type=T;};
template<class Tag>using type_t=typename Tag::type;

template<class T>using block_deduction=type_t<tag_t<T>>;

template<class R, class T, class...Args>
void MakeMemberActionDemoClass(
  R(T::*memberFunction)(Args...),
  block_deduction<Args>... args
) 
{
}
templatestruct标记{using type=t;};
templateusing type\u t=typename标记::type;
模板使用块推理=类型;
模板
void MakeMemberActionDemoClass(
R(T::*成员函数)(参数…),
块扣除…参数
) 
{
}
这可能需要复制两次值

template<class R, class T, class...Args, class...Params>
auto MakeMemberActionDemoClass(
  R(T::*memberFunction)(Args...),
  Params&&... params
) 
->decltype( (std::declval<T*>()->*memberFunction)( std::declval<Params>()... ) )
{
}
模板
自动生成成员ActionDemoClass(
R(T::*成员函数)(参数…),
Params&&…Params
) 
->decltype((std::declval()->*memberFunction)(std::declval()…)
{
}

将正确推断它们,并让您提前完善到
memberFunction
和SFINAE,以便及早检测过载故障。

使用
R(T::*memberFunction)(Args…,Params&&。。。args
,以便将它们分别导出为ank。请注意,我无法使第二个解决方案工作-一个decltype。Visual Studio 2013(更新5)不断给我一些错误。另外,需要注意的是,在第一个解决方案中,如果要生成tuple,则需要使用std::forward_as_tuple。@user1578026我修复了第二个解决方案中的一个拼写错误。也许会有帮助。但是VS2013和2015对
decltype
的支持很差,所以…@Piotr该死的
operator->*
我的老对手
template<class R, class T, class...Args, class...Params>
auto MakeMemberActionDemoClass(
  R(T::*memberFunction)(Args...),
  Params&&... params
) 
->decltype( (std::declval<T*>()->*memberFunction)( std::declval<Params>()... ) )
{
}