TypeName 函數 返回一個 String,提供有關變數的信息。
語法TypeName(varname)必要的 varname 參數是一個 Variant,它包含用戶定義類型變數之外的任何變數。
說明TypeName 所返回的字元串可以是下面列舉的任何一個字元串:
字元串變數對象類型為 objecttype 的對象
Byte位值
Integer整數
Long長整數
Single單精度浮點數
Double雙精度浮點數
Currency貨幣
Decimal十進位值
Date日期
String字元串
bool布爾值
Error錯誤值
Empty未初始化
Null無效數據
Object對象
Unknown類型未知的對象
Nothing不再引用對象的對象變數
如果 varname 是一個數組,則返回的字元串可以是任何一個後面添加了空括弧的可能的返回字元串(或 Variant)。例如,如果 varname 是一個整數數組,則 TypeName 返回 "Integer()"。
Typename關鍵字 告訴編譯把一個特殊的名字解釋成一個類型,在下列情況下必須對一個name使用typename關鍵字:
1一個唯一的name(可以作為類型理解),嵌套在另一個類型中;
2 依賴於一個模板參數,就是說模板參數在某種程度上包含這個name,當模板參數是編譯器在指認一個類型時便會產生誤解
為了保險起見,應該在所有編譯可能錯把一個type當成一個變數的地方使用typename,如果你的類型在模板參數中是有限制的,那就必須使用typename
例如:
函數模板:
template<typename T> //指出;函數模板形參,實際上就是指「任何內置類型」或「用戶定義類型」
T maximum(T value1, T value2)
{
if(value1 > value2)
{
return value1;
}
else
{
return value2;
}
}

typename關鍵字

"typename"是一個C++程序設計語言中的關鍵字。當用於泛型編程時是另一術語"class"的同義詞。這個關鍵字用於指出模板聲明(或定義)中的非獨立性名稱(dependent names)是類型名,而非變數名。以下是對於泛型編程中typename兩種迥然不同的用法的解釋。

1class關鍵字的同義詞

這是一項C++編程語言泛型編程(或曰「模板編程」)的功能,typename關鍵字用於引入一個模板參數,例如:
// 定義一個返回參數中較大者的通用函數
template<typename T>const
T& max(const T& x, const T& y)
{
if(y < x)
{
return x;
}
return y;
}
這種情況下,typename可用另一個等效的關鍵字class代替,如下代碼片段所示:
// 定義一個返回參數中較大者的通用函數
template<class T>const
T& max(const T& x, const T& y)
{
if(y < x)
{
return x;
}
return y;
}
以上兩段代碼沒有功能上的區別。

2類型名指示符

考慮下面的錯誤代碼:
template<typename T>void foo(const T& t)
{
// 聲明一個指向某個類型為T::bar的對象的指針
T::bar* p;
}
struct StructWithBarAsType
{
typedefint bar;
};
int main()
{
StructWithBarAsType x;
foo(x);
}
這段代碼看起來能通過編譯,但是事實上這段代碼並不正確。因為編譯器並不知道T::bar究竟是一個類型的名字還是一個某個變數的名字。究其根本,造成這種歧義的原因在於,編譯器不明白T::bar到底是不是「模板參數的非獨立名字」,簡稱「非獨立名字」。注意,任何含有名為「bar」的項的類T,都可以被當作模板參數傳入foo()函數,包括typedef類型、枚舉類型或者變數等。
為了消除歧義,C++語言標準規定:
A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.
意即出現上述歧義時,編譯器將自動默認bar為一個變數名,而不是類型名。所以上面例子中的代碼 T::bar * p 會被解釋為乘法,而不是聲明p為指向T::bar類型的對象的指針。
如果還有另一個名為StructWithBarAsValue類型,如下:
struct StructWithBarAsValue
{
int bar;
};
那麼,編譯器將以完全不同的方式來解釋
T::bar* p
的含義。
解決問題的最終辦法,就是顯示的告訴編譯器,T::bar是一個類型名。這就必須用typename關鍵字,例如:
template<typename T>
void foo(const T& t)
{
// 聲明一個指向某個類型為T::bar的對象的指針
typename T::bar* p;
}
這樣,編譯器就確定了T::bar是一個類型名,p也就自然地被解釋為指向T::bar類型的對象的指針了。
下一篇[VarType]

相關評論

同義詞:暫無同義詞