описатель типа decltype
decltype описатель типа создает тип указанного выражения.decltype описатель типа, а также автоматическое ключевое словов основном, полезны для разработчиков, которые записывают библиотеки стандартных шаблонов.Используйте auto и decltype объявления зависят от возвращаемого типа функции шаблона, типы его аргументов шаблона.Или используйте auto и decltype для объявления функции шаблона, который создает программу-оболочку вызов другой функции, а затем создать программу-оболочкуой возвращайте тип возвращаемого значения функции.
decltype( expression )
Параметры
Параметр |
Описание |
---|---|
expression |
Выражение.Дополнительные сведения см. в разделе Выражения (C++). |
Возвращаемое значение
Тип параметра expression.
Заметки
decltype описатель типа поддерживается в Visual C++ 2010 или более поздних версиях, а также может использоваться с собственным или управляемым кодом.
Компилятор использует следующие правила определения типа expression параметр.
Если expression параметр идентификатора или a доступ к членам класса" decltype(expression) тип сущности, с которым следуют expression.Если такая сущность или expression имена параметров набор перегруженных функций, компилятор создает сообщение об ошибке.
Если expression параметр вызов функции или перегруженной функции операторов decltype(expression) тип возвращаемого значения функции.Скобки вокруг перегруженного оператора не учитываются.
Если expression параметр значение rvalue" decltype(expression) тип expression.Если expression параметр lvalue" decltype(expression)ссылка lvalue тип expression.
В следующем примере кода показаны некоторые использует decltype описатель типа.Во-первых, предположим, что необходимо закодируйте следующие выписки.
int var;
const int&& fx();
struct A { double x; }
const A* a = new A();
Далее проверьте, какие типы возвращаются 4 decltype выписки в следующей таблице.
Оператор |
Тип |
Примечания |
---|---|---|
decltype(fx()); |
const int&& |
ссылка rvalue к a const int. |
decltype(var); |
int |
Тип переменной var. |
decltype(a->x); |
double |
Тип доступа к члену. |
decltype((a->x)); |
const double& |
Внутренние скобки, вызывают выписку должен вычисляться как вместо выражения доступа к члену.И a объявляет в качестве a const указатель введите ссылка на const double. |
Decltype и auto
Используйте decltype введите описатель вместе с auto объявление ключевое слово, зависят от возвращаемого типа функции шаблона, типы его аргументов шаблона.Например, рассмотрим следующий пример кода, в котором возвращаемый тип зависит от функции шаблона типы аргументов шаблона.В примере кода Нет данных заполнитель, указывающий, что возвращаемый тип не может быть указан.
template<typename T, typename U>
UNKNOWNfunc(T&& t, U&& u){ return t + u; };
Введение decltype описатель типа позволяет разработчику получить тип выражения, что возвращает функция шаблона.Используйте альтернативный синтаксис объявления функции это показано ниже, auto ключевое слово и decltype описатель типа для объявления a поздно-определено возвращаемый тип.Поздно-определенный тип возвращаемого значения определяется при объявлении компилироваться, а не при его закодировано.
Следующий прототип иллюстрирует синтаксис альтернативного объявления функции.Обратите внимание, что const и volatile квалификаторы и throwспецификация исключений необязательные. Function_body заполнитель представляет собой составное выписку, которая указывает, что функция делает.В качестве оптимального кодирования, метод Выражение местозаполнитель в decltype выписка должна соответствовать выражению, определенному return выписка, при наличии таковой, в function_body.
autofunction_name(параметрыOpt)constOptvolatileOpt−>decltype(Выражение)throwOpt{function_body};
В следующем примере кода поздно-определенный тип возвращаемых данных myFunc функция шаблона определяется типами t и u аргументы шаблона.В качестве оптимального практика кодирования, примере кода используется ссылка rvalue и forward шаблон функции, поддерживающие препровождение совершенное.Дополнительные сведения см. в разделе Декларатор ссылки Rvalue: &&.
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 и функции препровождения
Использование программы-оболочек вызовы функций препровождения к другим функциям.Рассмотрим шаблон функции, переадресует ее аргументы или результаты выражения, которое включает эти аргументы в другую функцию.Кроме того, функция препровождения возвращает результат вызывать другую функцию.В этом сценарии возвращаемый тип функции препровождения должен быть тем же, что и тип возвращаемого значения функции создания программу-оболочкуой.
В данном сценарии нельзя записать без соответствующее выражение типа decltype описатель типа.decltype описатель типа включает родовые функции препровождения, поскольку он не теряет необходимые сведения о возвращает значение, указывающее, является ли функция является ссылочным типом.Пример кода см. в предыдущей функции препровождения myFunc пример функции шаблона.
Пример
В следующем примере объявляется поздно-определенный возвращаемый тип функции шаблона Plus().Plus функция интерпретирует его операнда с 2 operator+ перегрузка.Следовательно, интерпретация добавочного оператора (+) и возвращаемый тип Plus значение зависит от функции типы аргументов функции.
// 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;
}
Output
Данный пример кода создает следующие результаты.
13
13.5
Hello, world!
42
Требования
Visual C++ 2010 или более поздние версии.