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
as
KeyType
;-)以来就得到了验证,调用操作符重载
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;

}