使用参数包推导函数参数类型
Deducing Function Parameter types using parameter packs
我正在尝试使用指向成员函数指针和参数包的指针来调用函数。下面是代码:
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);
}
我收到以下错误:
error C2782: 'void MakeMemberActionDemoClass(R (__thiscall T::* )(Args...),Args &&...)' : template parameter 'Args' is ambiguous
1> could be 'const DemoClass&, const int&'
1> or 'DemoClass&, int&'
如果我在 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
)
{
}
这具有可能复制值两次的成本。
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>()... ) )
{
}
将正确推导它们并让您尽早完善 memberFunction
和 SFINAE 以检测过载故障。
我正在尝试使用指向成员函数指针和参数包的指针来调用函数。下面是代码:
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);
}
我收到以下错误:
error C2782: 'void MakeMemberActionDemoClass(R (__thiscall T::* )(Args...),Args &&...)' : template parameter 'Args' is ambiguous
1> could be 'const DemoClass&, const int&'
1> or 'DemoClass&, int&'
如果我在 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
)
{
}
这具有可能复制值两次的成本。
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>()... ) )
{
}
将正确推导它们并让您尽早完善 memberFunction
和 SFINAE 以检测过载故障。