2012-04-11 53 views
27

我有一些類C,並希望將其實例和方法的地址傳遞給測試函數Test_C_Foo1()中的某個函子。 Functor是一個模板類,我必須提供類方法(MEMFN1)作爲其模板參數之一。我必須在某處定義MEMFN1類型,但不想更改C.h,並且不想用它污染全局名稱空間。我決定將typedef儘可能地本地化,以便將其放入測試函數中 - 在MEMFN1實際使用的範圍內。 在函數體內使用typedef是一種很好的做法嗎?在函數體內的typedef是不好的編程習慣嗎?

標準允許使用的typedef在函數體內,限制它只能在這些特殊情況下:

的類型定義符不得在DECL說明符-SEQ 與任何其他種類的結合除了類型說明符以外,不應在參數聲明 (8.3.5)的decl-specifier-seq中使用,也不應在函數定義(8.4)的decl-specifier-seq中使用。

下面的代碼片段:

C.h:

... 
#include <string> 
... 

class C 
{ 
public: 
    int foo1(const std::string&);  
}; 

main.cpp中:

... 
#include "C.h" 
... 

void Test_C_Foo1() 
{ 
    typedef int(C::*MEMFN1)(const std::string&); 

    C c; 
    Functor1<C, MEMFN1,...> f1(&c, &C1::foo1,...); 
    ... 
} 

... 

int main() 
{ 
    Test_C_Foo1(); 
    return 0; 
} 
+1

這只是罰款。 – Mat 2012-04-11 09:41:31

+0

夥計們,謝謝你的回答。在這種情況下,縮小* typedef *的範圍似乎是我自然的選擇,而且我懷疑只是因爲我不記得是否曾經在代碼或文獻中遇到過它。 – 2012-04-11 09:53:06

+0

你可以在C++ 11中使用'decltype'嗎? – 2012-04-11 11:06:33

回答

45

這是。這是合法的和本地化的。

+6

它比較好:它有時是必需的。把'typedef'想象成一種「類型變量賦值」。 – 2012-04-11 09:49:14

-4

恕我直言,如果typedef只是爲了避免鍵入或使指針到成員函數不那麼繁瑣,如你的例子所示,那麼很好。

但是,如果typedef揭示了一些特定的概念,那麼它應該是可見的功能之外。

簡單的測試,以檢查它是typedef名稱:

typedef int(C::*MEMFN1)(const std::string&); //OK: as local typedef, just an abbreviation 

typedef int(C::*ACTION)(const std::string&); //Not so OK: Action is a new concept 
+7

你是說如果一個名字意味着什麼,那麼它應該是全球性的?這是一個很奇怪的觀點。 – 2012-04-11 10:26:19

+1

@MikeSeymour - 好的,這是一個通用的指導原則。確切地說,不是全球性的,而是與其他概念相輔相成。例如,如果'ACTION' typedef有意義,它應該在'C'類旁邊定義。 – rodrigo 2012-04-11 10:32:51

+1

爲什麼downvote這個,chaps?再次,每個人都對編程哲學感到不滿? :) ..那裏甚至有一個恕我直言,這聽起來值得在這裏,..IMHO :)) – mlvljr 2017-03-08 20:07:54