Specifikátor typu decltype
decltype Dává specifikátor typu typ zadaný výraz.decltype Typ specifikátoru, spolu s klíčové slovo automaticky, je užitečné především pro vývojáře, kteří zapsat šablonu knihovny.Použití auto a decltype prohlásit funkce šablony, jejichž návrat typ závisí na typy argumentů šablony.Použít auto a decltype deklarovat funkci šablonu, která obtéká volání funkce jiného a vrátí typ vrácené hodnoty zalomený funkce.
decltype( expression )
Parametry
Parametr |
Description |
---|---|
expression |
Výraz.Další informace naleznete v tématu Výrazy (C++). |
Vrácená hodnota
Typ expression parametr.
Poznámky
decltype Specifikátor typu je podporována v roce 2010 Visual C++ nebo novější verze a lze s nativní nebo spravovaný kód.
Kompilátor používá následující pravidla pro určení typu expression parametr.
Pokud expression parametr je identifikátor nebo přístup člen třídy, decltype(expression) je typ entity pojmenovaný expression.Pokud žádný takový subjekt nebo expression názvů parametrů přetížené funkce sada, kompilátor dává chybové zprávy.
Pokud expression parametr je volání funkce nebo funkce jazyka přetíženého operátoru decltype(expression) je návratový typ funkce.Závorky okolo přetíženého operátoru jsou ignorovány.
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.
Následující příklad kódu ukazuje použití některých decltype zadejte specifikátor.Nejprve se předpokládá, že máte kódované následující příkazy.
int var;
const int&& fx();
struct A { double x; }
const A* a = new A();
Dále zkoumat vrácené čtyři typy decltype prohlášení v následující tabulce.
Prohlášení |
Type |
Poznámky |
---|---|---|
decltype(fx()); |
const int&& |
Odkaz rvalue se const int. |
decltype(var); |
int |
Typ proměnné var. |
decltype(a->x); |
double |
Typ člena přístup. |
decltype((a->x)); |
const double& |
Vnitřní závorky způsobit prohlášení má být vyhodnocen jako výraz namísto přístupu členských.A protože a je deklarován jako const je typ ukazatel, odkaz na const double. |
Decltype a Auto
Použití decltype typ specifikátoru, spolu s auto klíčové funkce šablony prohlásit, jehož návratový typ závisí na typy argumentů šablony.Například zvažte následující příklad kódu návratový typ šablony funkce závisí na typech argumenty šablony.V příkladu kódu Neznámý zástupný symbol označuje, že nelze zadat typ vrácení.
template<typename T, typename U>
UNKNOWNfunc(T&& t, U&& u){ return t + u; };
Zavedení decltype specifikátor typu umožňuje vývojáři získat typ výraz, který vrací funkce šablony.Použití Syntaxe deklarace funkce alternativní , později, zobrazí auto klíčové slovo a decltype zadejte specifikátor deklarovat pozdní zadané vracet typ.Pozdní zadaný typ vrácení je určena při prohlášení je zkompilován namísto při je kódována.
Následující prototypu ilustruje Syntaxe deklarace alternativní funkci.Všimněte si, že const a volatile kvalifikátory a throwspecifikace výjimku jsou volitelné.Function_body zástupný symbol představuje složený příkaz, který určuje funkce nemá.Jako nejlepší praxe, kódování výraz zástupný symbol v decltype prohlášení by měly odpovídat výraz určený return prohlášení, případně v function_body.
autofunction_name(parametersopt)constoptvolatileopt−>decltype(expression)throwopt{function_body};
V následujícím příkladu kódu vrátit pozdní zadaný typ myFunc funkce šablony je určena typy t a u šablona argumenty.Jako nejlepší, kódování praxi, například kód také používá odkazy rvalue a forward funkce šablony, které podporují perfect předávání.Další informace naleznete v tématu Rvalue referenční Declarator: & &.
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 a předávání funkcí
Funkce předávání obtékání volání jiných funkcí.Zvažte funkce šablony, která předá její argumenty nebo výsledky výrazu, který zahrnuje tyto argumenty jiné funkci.Kromě toho předávání vrátí výsledek volání jiné funkce.V tomto scénáři návratový typ funkce předávání by měly být stejné jako návratový typ zalomený funkce.
V tomto případě nelze zapsat výraz odpovídající typ bez decltype zadejte specifikátor.decltype Specifikátor typu umožňuje funkce předávání obecný, protože neztratil požadované informace o tom, zda funkce vrací typ odkazu.Příklad kódu funkce předávání naleznete v předchozím myFunc příkladu funkce šablony.
Příklad
Například následující kód deklaruje pozdní zadaný typ šablony funkce vrátit Plus().Plus Funkce zpracovává jeho dva operandy s operator+ přetěžování.V důsledku toho výklad operátor plus (+) a typ vrácení Plus funkce závisí na typech argumenty funkce.
// 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;
}
Výsledek
Příklad kódu výnosů následující výsledky.
13
13.5
Hello, world!
42
Požadavky
Visual C++ 2010 nebo novější verze.