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

时间:2015-03-13 13:10:16

标签: c++ linux function

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

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)

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

2 个答案:

答案 0 :(得分:5)

您无法在函数中访问未命名的参数。

您的问题的解决方案是改善您的坏工具或放弃它。

答案 1 :(得分:2)

如果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)是实现完美转发和避免虚假副本的方法。