Templates 推导成员函数的参数列表
我们希望能够推断模板中成员函数调用的参数列表。这是一个更大项目的一部分,该项目最终执行类型转换,允许调用目标函数 我们的研究结果表明,这对我们很有帮助 我们现在一直在寻找成员函数的类似概念。关键元素在以下源代码1示例中:Templates 推导成员函数的参数列表,templates,c++17,variadic-templates,template-meta-programming,Templates,C++17,Variadic Templates,Template Meta Programming,我们希望能够推断模板中成员函数调用的参数列表。这是一个更大项目的一部分,该项目最终执行类型转换,允许调用目标函数 我们的研究结果表明,这对我们很有帮助 我们现在一直在寻找成员函数的类似概念。关键元素在以下源代码1示例中: 在main中,comment//Free function.:这演示了Free函数的成功案例,并为Free函数展示了我们希望为成员函数实现的功能 在main中,注释对成员函数的外部调用。和问题1。这起草了我们试图支持的对成员函数的外部调用的目标语法 在对象::exec(…)中
- 在main中,comment
:这演示了Free函数的成功案例,并为Free函数展示了我们希望为成员函数实现的功能//Free function.
- 在main中,注释
和对成员函数的外部调用。
。这起草了我们试图支持的对成员函数的外部调用的目标语法问题1
- 在
中:这将从对象内部起草调用的目标语法对象::exec(…)
#包括
无空函数(int p1,double p2){
std::cout既然您希望包装器
通过模板参数包装成员函数指针,那么您必须知道如何调用成员函数指针。通常我们使用(obj.*mfptr)(args…
或(optr->*mfptr)(args…)调用成员函数指针
,显然对象本身也是调用操作所必需的。因此在包装器::运算符()
中,我们不仅需要每个参数,还需要对象
模板
结构包装器;
模板
结构包装器{
//似乎您不关心cvref限定符,所以我不会编写所有重载。
自动运算符()(T对象,参数…参数){
返回(obj.*F)(参数…);
}
自动运算符()(T*obj,Args…Args){
返回(obj->*F)(参数;
}
};
实际上,成员函数调用与将对象视为第一个参数的函数调用类似(而不是等于)
f;
f(foo{},3.14);
编辑:
既然您希望同时包装实例,包装器
必须与实例一起构造:
模板
结构包装器;
模板
结构包装器{
//我还省略了引用传递语义的重载。
包装器(tobj):实例(std::move(obj)){
自动运算符()(Args…Args){
返回(实例。*F)(参数…);
}
私人:
T例;
};
int main(){
富x;
包装f{x};
f(3.14);
}
如果没有类的实例,就不能调用成员函数。什么是f(3.14)
假设在这里使用?您的代码示例中没有foo
的实例。不编译
为什么不编译?有什么错误?请完整引用它。我打赌这很有启发性。@super:忘记了实例。编辑后,添加了实例。我想OP希望包装器记住实例:包装器f(x);f(3.14);/*的作用类似于x.bar(3.14);*/
-这是对包装的一个小修改;它只需要记住x
@RaymondChen我不确定OP是否知道成员函数调用需要对象本身,或者他需要函数包装(甚至是函数指针)这就像obj.bar
。我们可以让Wrapper
喜欢它,但我们也可以让Wrapper
喜欢使用函数指针的那个。这取决于OP真正想要什么。@RedFog&Raymond,目标是包装实例。太好了。学到了很多!