decltype türü belirticisi
decltype Tür belirleyici belirtilen ifadenin türü ortaya çıkarır. decltype İle birlikte belirleyici, yazın Otomatik anahtar sözcük, öncelikle Şablon Kütüphanesi yazma geliştiriciler için yararlı olur. Use auto ve decltype türü bir şablon işlevi, return bildirmek için şablon bağımsız değişkenlerinin türlerine bağlıdır. Veya auto ve decltype , başka bir işlev çağrısı sarar ve kaydırılan işlevinin dönüş türü verir bir şablon işlevi bildirmek için.
decltype( expression )
Parametre |
Description |
---|---|
expression |
Bir ifade. Daha fazla bilgi için bkz. Deyimler (C++). |
Tür expression parametresi.
decltype Türü belirticisi Visual C++ 2010 veya sonraki sürümlerinde desteklenir ve doğal veya yönetilen kod ile kullanılabilir.
Derleyici türünü belirlemek için aşağıdaki kuralları kullanır expression parametresi.
expression Parametresi, bir tanımlayıcı veya bir sınıf üyesi access, decltype(expression) olarak adlandırılmış varlık türü expression. Böyle bir varlık ise veya expression parametre adları aşırı yüklü bir işlevler kümesi, derleyici bir hata iletisi üretir.
expression Parametresi bir işlev veya bir fazla yüklenmiş işleç işlevi çağrısı decltype(expression) işlevinin dönüş türü. Fazla yüklenmiş işleç etrafındaki parantezlerle göz ardı edilir.
If the expression parameter is an rvalue, decltype(expression) is the type of expression. If the expression parameter is an lvalue, decltype(expression) is an lvalue reference to the type of expression.
Aşağıdaki kod örneği bazı kullanımlarını gösterir decltype belirleyici yazın. İlk olarak, aşağıdaki deyimleri kodlanmış olduğunu varsayalım.
int var;
const int&& fx();
struct A { double x; }
const A* a = new A();
Daha sonra dört tarafından döndürülen türlerini inceleyin decltype aşağıdaki tabloda bulunan ifadeler.
Deyimi |
Tür |
Notlar |
---|---|---|
decltype(fx()); |
const int&& |
Bir rvalue başvuru için bir const int. |
decltype(var); |
int |
Değişkenin türü var. |
decltype(a->x); |
double |
Üye erişim türüdür. |
decltype((a->x)); |
const double& |
İç üyesi access yerine bir ifade olarak değerlendirilecek deyimi neden. Ve çünkü a olarak bildirilmiş bir const , işaretçi türü olan bir başvuru const double. |
Kullanım decltype ile birlikte belirleyici, yazın auto anahtar sözcüğü, bir şablon işlevi, dönüş türü bildirmek için şablon bağımsız değişkenlerinin türlerine bağlıdır. Örneğin, aşağıdaki kod örneği şablonu işlevinin dönüş türü şablon değişkenlerini türlerinde olduğu göz önünde bulundurun. Kod örneği, Bilinmeyen yer tutucu gösterir dönüş türü belirtilemez.
template<typename T, typename U>
UNKNOWNfunc(T&& t, U&& u){ return t + u; };
Giriş decltype tür belirleyici şablon işlevi döndüren ifade türünün elde etmek bir uygulama geliştiricisi sağlar. Use Alternatif işlev bildirimi sözdizimi , gösterilen daha sonra auto anahtar sözcüğü ve decltype bildirmek için belirleyici yazın bir belirtilen geç dönüş türü. Bildirim derlendiğinde ne zaman onu kodlanmıştır yerine belirtilen geç dönüş türü belirlenir.
Aşağıdaki prototipe alternatif işlev bildirimi sözdizimi gösterilmektedir. Dikkat const ve volatile niteleyiciler ve throwözel durum belirtimi isteğe bağlıdır. Function_body yer tutucu işlevi ne yaptığını belirten bir bileşik deyim temsil eder. Bir en iyi yöntem, kodlama olarak ifade yer tutucu decltype deyimi tarafından belirtilen ifade eşleşmesi return deyimi, varsa, function_body.
autofunction_name(parametersopt)constoptvolatileopt−>decltype(expression)throwopt{function_body};
Aşağıdaki kod örneğinde, geç-belirtilen türü dönmek myFunc işlevi şablon türleri tarafından belirlenen t ve u şablon değişkenleri. Alıştırma kodlama bir iyi kod örneği de rvalue başvurular kullanır ve forward destek işlevi şablon kusursuz iletme. Daha fazla bilgi için bkz. Rvalue başvuru Bildiricisi: & &.
template<typename T, typename U>
auto myFunc(T&& t, U&& u) -> decltype (forward<T>(t) + forward<U>(u))
{ return forward<T>(t) + forward<U>(u); };
İletme işlevlerini diğer işlevleri çağrılarını kaydır. Bağımsız değişkenler ya da başka bir işlev için bu bağımsız değişkenleri gerektirir bir ifadenin sonuçlarını ileten işlevi şablon düşünün. Üstelik işlevinin çağrılması sonucunda iletme işlevi döndürür. Bu senaryoda, iletme işlevi dönüş türü kaydırılan işlevinin dönüş türü ile aynı olmalıdır.
Bu senaryoda, uygun türü ifade olmadan yazılamıyor decltype belirleyici yazın. decltype Tür belirleyici olup bir baþvuru türü bir işlev verir hakkında gerekli bilgileri kaybetmemek için genel iletme işlevlerini sağlar. Önceki bir iletme işlevi kod örneği için bkz: myFunc şablon işlevi örneği.
Aşağıdaki kod örneği, geç-belirtilen şablon işlevi türü dönmek bildirir Plus(). Plus İşlevi, iki işlenen işler operator+ tekrar. Sonuç olarak, artı (+) işleci ve dönüş türü yorumunu Plus işlevi, işlev bağımsız değişkenleri türlerine bağlıdır.
// decltype_1.cpp
// compile with: /EHsc
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <utility>
#include <iomanip>
using namespace std;
template<typename T1, typename T2>
auto Plus(T1&& t1, T2&& t2) ->
decltype(forward<T1>(t1) + forward<T2>(t2))
{
return forward<T1>(t1) + forward<T2>(t2);
}
class X
{
friend X operator+(const X& x1, const X& x2)
{
return X(x1.m_data + x2.m_data);
}
public:
X(int data) : m_data(data) {}
int Dump() const { return m_data;}
private:
int m_data;
};
int main()
{
// Integer
int i = 4;
cout <<
"Plus(i, 9) = " <<
Plus(i, 9) << endl;
// Floating point
float dx = 4.0;
float dy = 9.5;
cout <<
setprecision(3) <<
"Plus(dx, dy) = " <<
Plus(dx, dy) << endl;
// String
string hello = "Hello, ";
string world = "world!";
cout << Plus(hello, world) << endl;
// Custom type
X x1(20);
X x2(22);
X x3 = Plus(x1, x2);
cout <<
"x3.Dump() = " <<
x3.Dump() << endl;
}
Çıktı
Bu kod örneği, aşağıdaki sonuçları verir.
13
13.5
Merhaba, dünya!
42
Visual C++ 2010 veya sonraki sürümleri.