2015-03-13 36 views
1

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

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)

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

+0

如果要在函数中使用它们,'struct TypeA,TypeB&'都需要一个名称,如果没有它们,它就不应该编译。函数原型不需要命名参数,但定义的确如此。 – NathanOliver 2015-03-13 13:16:33

+3

@NathanOliver不,你可以在定义中有未命名的参数,你只是不能访问它们。 – 2015-03-13 13:18:14

+1

@NathanOliver:你有标准的引用吗?我在函数定义中看到很多未命名的参数。这是避免“未使用变量”警告的一种方法,我从来没有见过一个以任何方式抱怨它的编译器。 – 2015-03-13 13:18:16

回答

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

5

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

您的问题的解决方案是要么改善你的坏工具,要么抛弃它。