Пространства имён
Варианты
Действия

std::result_of

Материал из cppreference.com
< cpp‎ | types
 
 
 
Поддержка типов
Основные типы
Оригинал:
Basic types
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Основные типы
Исправлены типы целых ширину (C++11)
Числовые пределы
Оригинал:
Numeric limits
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
numeric_limits
С числовым ограничивает интерфейс
Время тип информации
Оригинал:
Runtime type information
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Тип черты
Оригинал:
Type traits
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Первичные категории типа
Оригинал:
Primary type categories
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
is_void(C++11)
is_array(C++11)
is_pointer(C++11)
is_enum(C++11)
is_union(C++11)
is_class(C++11)
is_function(C++11)
is_object(C++11)
is_scalar(C++11)
is_compound(C++11)
is_integral(C++11)
is_floating_point(C++11)
is_fundamental(C++11)
is_arithmetic(C++11)
is_reference(C++11)
is_lvalue_reference(C++11)
is_rvalue_reference(C++11)
is_member_pointer(C++11)
is_member_object_pointer(C++11)
is_member_function_pointer(C++11)
Тип свойства
Оригинал:
Type properties
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
is_const(C++11)
is_volatile(C++11)
is_pod(C++11)
is_empty(C++11)
is_polymorphic(C++11)
is_abstract(C++11)
Поддерживаемые операции
Оригинал:
Supported operations
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
is_constructible
is_trivially_constructible
is_nothrow_constructible
(C++11)
(C++11)
(C++11)
is_default_constructible
is_trivially_default_constructible
is_nothrow_default_constructible
(C++11)
(C++11)
(C++11)
is_copy_constructible
is_trivially_copy_constructible
is_nothrow_copy_constructible
(C++11)
(C++11)
(C++11)
is_move_constructible
is_trivially_move_constructible
is_nothrow_move_constructible
(C++11)
(C++11)
(C++11)
is_assignable
is_trivially_assignable
is_nothrow_assignable
(C++11)
(C++11)
(C++11)
is_copy_assignable
is_trivially_copy_assignable
is_nothrow_copy_assignable
(C++11)
(C++11)
(C++11)
is_move_assignable
is_trivially_move_assignable
is_nothrow_move_assignable
(C++11)
(C++11)
(C++11)
is_destructible
is_trivially_destructible
is_nothrow_destructible
(C++11)
(C++11)
(C++11)
has_virtual_destructor(C++11)
Отношения собственности и запросов
Оригинал:
Relationships and property queries
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
is_same(C++11)
is_base_of(C++11)
is_convertible(C++11)
alignment_of(C++11)
rank(C++11)
extent(C++11)
Тип модификаций
Оригинал:
Type modifications
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
remove_cv
remove_const
remove_volatile
(C++11)
(C++11)
(C++11)
add_cv
add_const
add_volatile
(C++11)
(C++11)
(C++11)
make_signed(C++11)
make_unsigned(C++11)
Тип преобразования
Оригинал:
Type transformations
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
aligned_storage(C++11)
aligned_union(C++11)
decay(C++11)
enable_if(C++11)
conditional(C++11)
common_type(C++11)
underlying_type(C++11)
result_of(C++11)
Введите черта констант
Оригинал:
Type trait constants
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
integral_constant(C++11)
 
Определено в заголовочном файле <type_traits>
template< class >

class result_of; // Не определён
template< class F, class... ArgTypes >

class result_of<F(ArgTypes...)>;
(начиная с C++11)

Выводит тип возврата при вызове функции в момент компиляции.

F должен быть вызываемым типом, ссылкой на функцию, ссылкой на вызываемый тип. Вызов F с ArgTypes... должен быть корректным (начиная с C++11)
F и все типы в ArgTypes могут быть полными типами, массивами с неизвестными границами или (с cv-квалификаторами) void (начиная с C++14)

Содержание

[править] Тип-член

Тип Определение
type тип возврата Callable (вызываемых) типов F, если вызов был совершён с аргументами ArgTypes.... Определён только тогда, когда F может быть вызван с аргументами ArgTypes... в контексте, не требующем вычисления. (начиная с C++14)

[править] Вспомогательный тип

template< class T >
using result_of_t = typename result_of<T>::type;
(начиная с C++14)

[править] Возможная реализация

namespace detail {
template <class F, class... Args>
inline auto INVOKE(F&& f, Args&&... args) ->
    decltype(forward<F>(f)(forward<Args>(args)...)) {
      return forward<F>(f)(forward<Args>(args)...);
}
 
template <class Base, class T, class Derived>
inline auto INVOKE(T Base::*pmd, Derived&& ref) ->
    decltype(forward<Derived>(ref).*pmd) {
      return forward<Derived>(ref).*pmd;
}
 
template <class PMD, class Pointer>
inline auto INVOKE(PMD&& pmd, Pointer&& ptr) ->
    decltype((*forward<Pointer>(ptr)).*forward<PMD>(pmd)) {
      return (*forward<Pointer>(ptr)).*forward<PMD>(pmd);
}
 
template <class Base, class T, class Derived, class... Args>
inline auto INVOKE(T Base::*pmf, Derived&& ref, Args&&... args) ->
    decltype((forward<Derived>(ref).*pmf)(forward<Args>(args)...)) {
      return (forward<Derived>(ref).*pmf)(forward<Args>(args)...);
}
 
template <class PMF, class Pointer, class... Args>
inline auto INVOKE(PMF&& pmf, Pointer&& ptr, Args&&... args) ->
    decltype(((*forward<Pointer>(ptr)).*forward<PMF>(pmf))(forward<Args>(args)...)) {
      return ((*forward<Pointer>(ptr)).*forward<PMF>(pmf))(forward<Args>(args)...);
}
} // namespace detail
 
// Минимальная для C++11 реализация:
template <class> struct result_of;
template <class F, class... ArgTypes>
struct result_of<F(ArgTypes...)> {
    using type = decltype(detail::INVOKE(std::declval<F>(), std::declval<ArgTypes>()...));
};
 
// Подходящая для C++14 реализация (также подходит для реализации C++11):
namespace detail {
template <typename, typename = void>
struct result_of {};
template <typename F, typename...Args>
struct result_of<F(Args...),
                 decltype(void(detail::INVOKE(std::declval<F>(), std::declval<Args>()...)))> {
    using type = decltype(detail::INVOKE(std::declval<F>(), std::declval<Args>()...));
};
} // namespace detail
 
template <class> struct result_of;
template <class F, class... ArgTypes>
struct result_of<F(ArgTypes...)> : detail::result_of<F(ArgTypes...)> {};

[править] Примечание

Как следует из C++11, поведение будет не определено, если INVOKE(std::declval<F>(), std::declval<ArgTypes>()...) будет не корректно (например, когда F вовсе не является вызываемым типом, std::result_of<F(ArgTypes...)> просто тогда не будет содержать член type).

Необходимость std::result_of заключается в том, чтобы определить тип результата вызова Callable (вызываемых) типов, в частности, когда он зависит от переданных ему аргументов.

F(Args...) является типом функции, где Args... являются типами аргументов, а F является типом возврата. Следовательно, F не может быть типом функции (но может быть ссылкой на тип функции).

[править] Пример

#include <type_traits>
#include <iostream>
 
struct S {
    double operator()(char, int&);
    float operator()(int) { return 1.0;}
};
 
template<class T>
typename std::result_of<T(int)>::type f(T& t)
{
    std::cout << "Перегрузка f для вызываемых T\n";
    return t(0);
}
 
template<class T, class U>
int f(U u)
{
    std::cout << "Перегрузка f для невызываемых T\n";
    return u;
}
 
int main()
{
    // Результат вызова S с аргументами типа char и int& является double
    std::result_of<S(char, int&)>::type d = 3.14; // d будет иметь тип double
    static_assert(std::is_same<decltype(d), double>::value, "");
 
    // Результат вызова S с аргументом типа int является float
    std::result_of<S(int)>::type x = 3.14; // f имеет тип float
    static_assert(std::is_same<decltype(x), float>::value, "");
 
    // result_of может быть использован с указателем на функцию-член как тут
    struct C { double Func(char, int&); };
    std::result_of<decltype(&C::Func)(C, char, int&)>::type g = 3.14;
    static_assert(std::is_same<decltype(g), double>::value, "");
 
    f<C>(1); // Может не скомпилироваться в C++11; вызов не допускающее вызов перегрузки в C++14
}

Вывод:

Перегрузка f для невызываемых T

[править] См. также

Шаблон:cpp/utility/functional/dsc invokeШаблон:cpp/types/dsc is callable
(C++11)
получает тип выражения в невычисленного контексте
Оригинал:
obtains the type of expression in unevaluated context
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(шаблон функции) [править]