2015-03-13 41 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

您無法訪問函數中的未命名參數。

您的問題的解決方案是要麼改善你的壞工具,要麼拋棄它。