不幸的是,我已經失去了本文的鏈接和源代碼,但我確實記得它是關於元編程和C++中的模板;當談到模板方法的侷限性時,這篇文章談到了傳遞給模板的東西不是泛型,而只是帶有相關地址的類型(或者可尋址的,我不記得確切的單詞)可以作爲參數傳遞給模板。C++類型是從地址抽象? - C++模板
有人可以澄清地址,類型和模板之間的這種關係嗎?
一個類型可以用地址標識嗎?
編輯
例如at this link,在鏈接的常見問題的最後一部分,模板系統是喜歡的事,需要一個地址,而不是一個通用的類型描述。
不幸的是,我已經失去了本文的鏈接和源代碼,但我確實記得它是關於元編程和C++中的模板;當談到模板方法的侷限性時,這篇文章談到了傳遞給模板的東西不是泛型,而只是帶有相關地址的類型(或者可尋址的,我不記得確切的單詞)可以作爲參數傳遞給模板。C++類型是從地址抽象? - C++模板
有人可以澄清地址,類型和模板之間的這種關係嗎?
一個類型可以用地址標識嗎?
編輯
例如at this link,在鏈接的常見問題的最後一部分,模板系統是喜歡的事,需要一個地址,而不是一個通用的類型描述。
我不知道你讀到的原文,但是你在編輯中鏈接到的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 *
的參數。
大多數常用的模板可以使用類型參數或非整型,枚舉或用戶定義類型的非類型參數。這些與存儲器地址無關。在使用模板和使用內存地址之間沒有隱式連接。
這裏是一個地址識別的類型的例子:
int foo;
template <int *IP>
class Bar {
};
Bar<&foo> baz;
但不知何故,我不認爲這是什麼意思的文章。
類型本身在C++中沒有地址。一個類型中的單個定義可能有也可能沒有它們自己的地址。而有些東西只在類型的一個實例中有地址。
我在那裏使用的技巧只能用於程序整個生命週期中存在的對象。然後該對象的地址成爲該類型名稱的一部分。
模板甚至不是C++中的類型。它們只是在用一組特定參數實例化時纔是一種類型。而且他們也沒有地址。
再次,我很抱歉,但我已經失去了這個良好的鏈接,它更多的是關於設計和通用的限制,它談論的地址不像指針或引用地址。更像是一個模板應該接受的輸入和結構限制。 – Ken
http://www.comeaucomputing.com/techtalk/templates/#stringliteral混淆不斷上升,但我認爲那篇文章的意思是說類似於該鏈接上常見問題的最後部分。但我不記得這個地址到底是什麼...... – Ken
@Ken:我認爲'名稱與外部連接'的對象也是如此,但g ++對'static'感到滿意。 – Omnifarious
類型大多隻在編譯時才知道(RTTI http://en.wikipedia.org/wiki/Run-time_type_information是例外)。地址在運行時沒有定義的類型。 (例如'malloc'或'mmap'的返回),因爲通過將指針指向不同的類型,您不會更改它所包含的地址。 –
我不確定你在這裏問什麼。您引用的FAQ條目是關於傳遞**非類型**模板參數。功能地址,積分等是這樣的。字符串文字是一個非常棘手的例外,它不會像您所期望的那樣工作,因此也是FAQ條目。 – pmr
你確定你沒有想到_linkage_而不是「可尋址」嗎? – ildjarn