2012-10-14 46 views
0

不幸的是,我已經失去了本文的鏈接和源代碼,但我確實記得它是關於元編程和C++中的模板;當談到模板方法的侷限性時,這篇文章談到了傳遞給模板的東西不是泛型,而只是帶有相關地址的類型(或者可尋址的,我不記得確切的單詞)可以作爲參數傳遞給模板。C++類型是從地址抽象? - C++模板

有人可以澄清地址,類型和模板之間的這種關係嗎?

一個類型可以用地址標識嗎?


編輯

例如at this link,在鏈接的常見問題的最後一部分,模板系統是喜歡的事,需要一個地址,而不是一個通用的類型描述。

+0

類型大多隻在編譯時才知道(RTTI http://en.wikipedia.org/wiki/Run-time_type_information是例外)。地址在運行時沒有定義的類型。 (例如'malloc'或'mmap'的返回),因爲通過將指針指向不同的類型,您不會更改它所包含的地址。 –

+0

我不確定你在這裏問什麼。您引用的FAQ條目是關於傳遞**非類型**模板參數。功能地址,積分等是這樣的。字符串文字是一個非常棘手的例外,它不會像您所期望的那樣工作,因此也是FAQ條目。 – pmr

+0

你確定你沒有想到_linkage_而不是「可尋址」嗎? – ildjarn

回答

3

我不知道你讀到的原文,但是你在編輯中鏈接到的FAQ是而不是談論類型和地址之間的連接。

它講述了一種特定類型的模板參數,非類型參數。有三種模板參數:類型,非類型模板。所以這就是第二種。

非類型參數的一個例子是在下面的定義Id

template <const char *Id> 
struct C 
{}; 

Id不表示類型,但非類型,即一個實際值。在這個特定的例子中,該值碰巧是一個指針類型,它表示一個字符串的地址。

的想法是,你可以用它來實例化使用字符串作爲區分器模板:

C<"foo"> c1; // Instantiating the "foo" version of type C 
C<"bar"> c2; // Instantiating the "bar" version of type C 

不幸的是,它並不像這樣–工作,這是常見問題的文章是關於什麼的。它解釋說,對於非類型的模板參數,您必須使用常量表達式,在這種情況下,您必須使用具有外部鏈接的對象的標識符,而不僅僅是文字。所以你可以這樣做的唯一方法是:

template <const char *Id> 
struct C 
{ 

}; 

char id1[] = "foo"; 
char id2[] = "bar"; 

int main() 
{ 
    C<id1> c1; 
    C<id2> c2; 
    /*...*/ 
    return 0; 
} 

這就是FAQ文章解釋的內容。

但是,同樣,這是一個非常特殊的情況下,因爲它僅適用於一個地址類型的非類型參數。請注意,地址的連接被給出,因爲非類型參數被顯式指定爲指針類型const char *的參數。

大多數常用的模板可以使用類型參數或非整型,枚舉或用戶定義類型的非類型參數。這些與存儲器地址無關。在使用模板和使用內存地址之間沒有隱式連接。

1

這裏是一個地址識別的類型的例子:

int foo; 

template <int *IP> 
class Bar { 
}; 

Bar<&foo> baz; 

但不知何故,我不認爲這是什麼意思的文章。

類型本身在C++中沒有地址。一個類型中的單個定義可能有也可能沒有它們自己的地址。而有些東西只在類型的一個實例中有地址。

我在那裏使用的技巧只能用於程序整個生命週期中存在的對象。然後該對象的地址成爲該類型名稱的一部分。

模板甚至不是C++中的類型。它們只是在用一組特定參數實例化時纔是一種類型。而且他們也沒有地址。

+0

再次,我很抱歉,但我已經失去了這個良好的鏈接,它更多的是關於設計和通用的限制,它談論的地址不像指針或引用地址。更像是一個模板應該接受的輸入和結構限制。 – Ken

+0

http://www.comeaucomputing.com/techtalk/templates/#stringliteral混淆不斷上升,但我認爲那篇文章的意思是說類似於該鏈接上常見問題的最後部分。但我不記得這個地址到底是什麼...... – Ken

+0

@Ken:我認爲'名稱與外部連接'的對象也是如此,但g ++對'static'感到滿意。 – Omnifarious