2013-12-17 84 views
1

C++模板至少檢查兩次。首先,定義一個模板&,其次是實例化。模板成功實例化後,它處於安全狀態。我的問題是,當模板成功定義爲&時,模板所在的州的名稱是什麼? 如果我將宏與模板進行比較,是否成功的宏「實例化」後代碼是類型安全的?C++模板只是「語法安全」,而不是先安全的?

#define BAR(x) return x; 
         ^
// BAR is preprocessor-grammar-safe here? 

struct Bar 
{ 
    static void bar() {} 
}; 
^
// Bar is type safe at this point? 

template<typename T> 
void foo() 
{ 
    T::bar(); 
} 
^ 
// foo is C++-grammar safe at this point? 

int main() 
{ 
    foo<Bar>(); 
      ^
    // foo is type safe at this point? 

    foo<int>(); 
     ^
    // foo is ill-formed here? 

    BAR(0); 
     ^
    // BAR is type safe at this point? 

    return 0; 
} 
+0

我不確定*語法安全*有一個確切的含義,我相信你的問題的答案可能是編譯器的具體.... –

+0

@BasileStarynkevitch說編譯器開發人員:) – 2013-12-17 19:05:11

+0

這是一個加載的問題。你說很多聽起來像是文字的東西,但實際上並沒有任何意義。因此,很難做出迴應。 –

回答

1

將C++模板想象成類固醇上的宏並具有語法知識。 ex。

template<typename T> 
void func(T t) { 
    t.foo(); 
    ... 

沒有聲明T必須具有foo()函數的事實; 這將C++模板與Scala類型參數區分開來。 我相信較新的C++版本已經爲此添加了一些支持。你基本上使用t.foo()讓編譯「嘗試」,如果沒有這樣的函數,它將無法編譯。

+0

至少我有類似的建議:https://github.com/hun-nemethpeter/cpp-reflector-mini/blob/master/Proposal.md –

3

模板是一個模板。

類型是一種類型。

類型可以通過專門化模板(通俗口語中的「實例化」)來獲得。

模板和類型有名稱。作爲工會和類的類型必須進行聲明和定義才能完成。必須聲明模板,並將其定義爲專用模板。

這就是我所能想到的,這應該足以說明C++類型系統在「初稿」類型層次上的大多數方面。

+0

這是真的,但不告訴我關於類型安全的聲明模板以及類型安全的東西。 –

1

你只是錯過一點點點:宏處理

假設預處理產生了有效的代碼文本處理(編譯之前完成): 模板可以成功申報。然而,實例化(定義)可能會失敗。

基本上是BAR(0);是不安全的(在這裏誇大了一點)!

+0

您可以將模板實例化看作類似宏的工具,但可以在實際的C++編譯器內運行。 – seand

+0

模板實例化是模板的定義嗎?我想申明:template void foo();定義:template void foo(){T :: bar(); } –

+0

BAR(0);編譯成功,它不處於安全狀態? –