在不知道名称的情况下访问函数参数

Is accessing function parameters without knowing names possible

本文关键字:访问 函数 参数 情况下 不知道      更新时间:2023-10-16

我想知道是否可以在不知道所有参数名称的情况下访问成员函数的参数列表(但知道所有参数类型的每个细节)。请参阅下面的代码:

struct TypeA
{
    int a;
    int b;
};
class TypeB
{
public:
    string mSth;
    char*  mPtr;
};
class SomeClass
{
    public:
        inline void SomeFunc(struct TypeA, TypeB&)
        {
            // how to access the parameters here??
            // if no parameter names are given??
        }
};

我为什么要这样做是因为我的代码是由某个工具生成的,并且每次该工具生成时,它都会为SomeClass::SomeFunc的参数列表提供不同的名称。

例如,这次是inline void SomeFunc(struct TypeA param1, TypeB& param2),而下一次可能是inline void SomeFunc(struct TypeA param3, TypeB& param4)

而且我不想仅仅因为参数名称已更改而重写函数体。

不能访问函数中的未命名参数。

问题的解决方案是改进您的不良工具或放弃它。

如果SomeFunc没有重载,你可以以有限的方式访问这些类型,并且你知道函数的名称。 您可以生成包含参数类型列表的类型包。

但是,您无法访问参数本身。

解决问题的最简单方法可能是将函数转发到您编写的另一个具有稳定参数名称的函数。 那么只需要重写"包装"函数,不需要重写包装的函数。

    inline void SomeFunc(struct TypeA random_name_77, TypeB& random_name_82)
    {
      auto impl=[this](struct TypeA&& p1, TybeB& p2){
        // your code goes here
      };
      impl(
        std::forward<decltype(random_name_77)>(random_name_77),
        std::forward<decltype(random_name_77)>(randon_name_82)
      );
    }

现在,当工具生成的参数名称更改时,只需要更改尾部(调用impl的部分)。 impl 中的新参数名称是您选择的任何内容。

&&std::forward<decltype(var)>(var)是实现完美转发和避免虚假副本的方法。