Udostępnij za pośrednictwem


decltype specyfikatora typu

decltype Specyfikatora typu plonów typu określonego wyrażenia.decltype Wpisz specyfikatora, wraz z słowa kluczowego auto, jest przydatna przede wszystkim programistów piszących szablon biblioteki.Użyj auto i decltype deklarowania funkcji szablonów, których zwrot typu zależy od typów argumentów szablonu.Lub użyj auto i decltype Aby zadeklarować funkcję szablonu, która otacza wywołanie do innej funkcji, a następnie zwraca zwracany typ funkcji zawinięty.

 decltype( expression )

Parametry

Parametr

Opis

expression

Wyrażenie.Aby uzyskać więcej informacji, zobacz Wyrażenia (C++).

Wartość zwracana

Typ expression parametru.

Uwagi

decltype Specyfikatora typu w Visual C++ 2010 lub nowszych wersji nie jest obsługiwane i może być używany z kod macierzysty lub zarządzany.

Kompilator stosuje następujące zasady w celu określenia typu z expression parametru.

  • Jeśli expression parametr jest identyfikatorem lub dostęp do klas Członkowskich, decltype(expression) jest typem encji, o nazwie przez expression.Jeśli nie ma taki podmiot lub expression zestaw funkcji zastąpionej nazwy parametrów, kompilator zwraca komunikat o błędzie.

  • Jeśli expression parametr jest wywołanie funkcji lub funkcja Przeciążony operator decltype(expression) jest zwracany typ funkcji.Nawiasy wokół Przeciążony operator są ignorowane.

  • 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.

Poniższy przykład kodu pokazuje niektórych zastosowań decltype specyfikatora typu.Po pierwsze założono, że zostały zakodowane następujące instrukcje.

int var;
const int&& fx(); 
struct A { double x; }
const A* a = new A();

Następnie zbadać typów, które są zwracane przez cztery decltype instrukcji w poniższej tabeli.

Instrukcja

Typ

Notatki

decltype(fx());

const int&&

Odniesienia rvalue do const int.

decltype(var);

int

Typ zmiennej var.

decltype(a->x);

double

Typ dostępu Członkowskich.

decltype((a->x));

const double&

Wewnętrzna nawiasy spowodować instrukcji oceniane jako wyrażenie, zamiast członek access.A ponieważ a jest zadeklarowana jako const wskaźnik, typ jest to odwołanie do const double.

Decltype i Auto

Użyj decltype wpisz specyfikatora, wraz z auto słowa kluczowego deklarowania funkcji szablonu, którego typ zwracany zależy od typów argumentów szablonu.Rozważmy na przykład w poniższym przykładzie kodu, w którym zwracany typ funkcji szablonu zależy od typów argumentów szablonu.W przykładzie kodu Nieznany zastępczy wskazuje, że zwracany typ nie może być określony.

template<typename T, typename U>
UNKNOWNfunc(T&& t, U&& u){ return t + u; }; 

Wprowadzenie decltype specyfikatora typu umożliwia autora do uzyskania typu wyrażenie, które zwraca funkcja szablonu.Użyj Składnia deklaracji funkcji alternatywnych który jest pokazany później, auto słowa kluczowego oraz decltype wpisz specyfikatora zadeklarować pod koniec określonego zwraca typ.Pod koniec określony typ zwracany jest określana, gdy zgłoszenie jest kompilowany, zamiast od tego, kiedy jest kodowana.

Następujący prototyp, ilustruje składnię deklaracji funkcji alternatywnych.Należy zauważyć, że const i volatile kwalifikatory oraz throwspecyfikacji wyjątek są opcjonalne.Function_body symbol zastępczy reprezentuje mieszanek stwierdzenie, że Określa, co robi funkcja.Najlepszej praktyki, kodowanie wyrażenie symbolu zastępczego w decltype instrukcja powinna odpowiadać wyrażenie określone przez return instrukcji, ewentualnie w function_body.

autofunction_name(parametersopt)constoptvolatileopt−>decltype(expression)throwopt{function_body};

W poniższym przykładzie kodu koniec określone zwraca typ myFunc funkcji szablonu zależy od typów t i u argumenty szablonu.Najlepszej praktyki kodowania, przykładowy kod używa również odwołania do rvalue i forward funkcji szablonu, który obsługuje perfect przesyłanie dalej.Aby uzyskać więcej informacji, zobacz Odwołanie Rvalue; niewłaściwy deklarator: & &.

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); }; 

Decltype i funkcje związane z przekazywaniem

Przesyłanie dalej funkcje Zawijaj wywołań do innych funkcji.Należy wziąć pod uwagę szablonu funkcja, która przesyła dalej jej argumentów lub wyniki wyrażenia, która obejmuje tych argumentów innej funkcji.Ponadto funkcja przesyłania dalej zwraca wynik wywołania innych funkcji.W tym scenariuszu należy zwracany typ funkcji przesyłania dalej, taki sam, jak zwracany typ funkcji zawinięty.

W tym scenariuszu nie można zapisać wyrażenia w odpowiedniego typu bez decltype specyfikatora typu.decltype Specyfikatora typu umożliwia rodzajowy przekazywania funkcji, ponieważ nie traci wymagane informacje na temat tego, czy funkcja zwraca typ odwołania.Na przykład kod funkcji przesyłania dalej, zobacz poprzednią myFunc przykład funkcji szablonu.

Przykład

Poniższy przykład kodu deklaruje koniec określone zwracany typ funkcji szablonu Plus().Plus Funkcja przetwarza jej dwa operandy z operator+ na przeciążenie.W konsekwencji, interpretacja operatora plus (+) i typem powrotu Plus funkcji zależy od typów argumentów funkcji.

// 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;
}

Dane wyjściowe

Poniższy przykład kodu daje następujące wyniki.

13

13.5

Hello, world!

42

Wymagania

Visual C++ 2010 lub nowsze wersje.

Zobacz też

Informacje

Nazwy typów prostych