C++ 调用类的单个公共函数而不使用其名称
是否可以基于类是唯一公共函数的事实来调用该类的函数?我的意思是: 比如:C++ 调用类的单个公共函数而不使用其名称,c++,reflection,C++,Reflection,是否可以基于类是唯一公共函数的事实来调用该类的函数?我的意思是: 比如: double res=MyClass().myFunction(n); 变成 double res=MyClass()[0](n); : double res=MyClass().reflection(“myFunction”)(n); 但是,如果不浪费至少两倍的墨水来编写函数名(函数指针和映射中相应的字符串),似乎是不可能的。您可以重载类的调用运算符。这通常称为函子: class MyClass { public:
double res=MyClass().myFunction(n);
变成
double res=MyClass()[0](n);
:
double res=MyClass().reflection(“myFunction”)(n);
但是,如果不浪费至少两倍的墨水来编写函数名(函数指针和映射中相应的字符串),似乎是不可能的。您可以重载类的调用运算符。这通常称为函子:
class MyClass {
public:
int operator()(int param) const {
return functionName(param);
}
int functionName(int param) const { return param; }
};
MyClass c;
int returnVal = c(3);
编辑寻址const
注释:
函数和运算符不需要是const
。只要函数不修改对象的状态,就应该标记函数const
。这为调用函数的人提供了更多信息,在多线程应用程序中尤为重要。如果调用的函数不是const,则可以从重载中删除const
有关更多信息,请参阅。通过重载
[]
运算符,可以获得与所编写内容相近的内容:
#include <iostream>
class MyClass
{
public:
double operator [] (int n)
{
return functionName (n);
}
private:
double functionName (int n)
{
return n + 1;
}
};
int main ()
{
int n = 1;
double res = MyClass ()[n];
std::cout << "res: " << res << std::endl;
return 0;
}
请参见@AntoninGAVREL您可以在重载运算符的主体中执行任何操作,并且您可以使用所需的任何参数替换
int param
。它就像一个函数一样工作。您也可以从那里调用其他函数。我相信您,但我得到了错误:将'const MyClass'作为'this'参数传递会丢弃限定符[-fppermissive]
@AntoninGAVREL在您的情况下,您需要一个调用运算符重载,如图所示,它接受类型为const std::string&
,,然后用于转换为实际的函数调用(例如,使用<代码> STD::MAP)意味着调用操作符的类的实例是const,并且没有将操作符标记为const。@ DehanJangson考虑在我的评论后面用另一个来扩展示例。这样就不会混淆OP,也可以用调用操作符超载(函子)来做什么。。也很好+1此处使用的数组下标运算符通常是以size\t
作为参数定义的,但这只是一种约定,因为该运算符通常用于(索引到容器中)。这不是语言标准所要求的。@Ari“但有趣的是,我甚至能够使它适用于std::string!”是的!自从第一个版本的std::map
被实例化为类型std::string
asKeyType
;-)以来就得到了验证,调用操作符重载operator()(const std::string&fnName)
BTW也是如此。“传递给[]的参数应该是大小的”没有这样的要求。@AntoninGAVREL取决于您实际需要什么,但您也可以使用动态定义的lambda函数轻松实现这样的调用(不需要额外的参数就可以捕获局部变量)。为什么要这样做?
#include <iostream>
#include <string>
class MyClass
{
public:
std::string operator [] (std::string n)
{
return functionName (n);
}
private:
std::string functionName (std::string n)
{
return n + '1';
}
};
int
main ()
{
std::string n = "test";
std::string res = MyClass ()[n];
std::cout << "res: " << res << std::endl;
}