Spec-Zone.ru › C++

std::meta::is_constructor, std::meta::is_default_constructor, std::meta::is_copy_constructor, std::meta::is_move_constructor

Определён в заголовочном файле <meta>
consteval bool is_constructor( std::meta::info r );
(1) (начиная с C++26)
consteval bool is_default_constructor( std::meta::info r );
(2) (начиная с C++26)
consteval bool is_copy_constructor( std::meta::info r );
(3) (начиная с C++26)
consteval bool is_move_constructor( std::meta::info r );
(4) (начиная с C++26)

Возвращает true, если r представляет:

1) конструктор,
2) конструктор по умолчанию,
3) конструктор копирования,
4) перемещающий конструктор.

В противном случае возвращает false.

Параметры

r - значение отражения

Возвращаемое значение

true, если r представляет указанный конструктор, в противном случае — false

Пример

#include <iostream>
#include <memory>
#include <meta>

template <typename C>
    requires(std::meta::is_class_type(^^C))
constexpr void print_constructors()
{
    constexpr static auto class_name =
        std::define_static_string(std::meta::display_string_of(^^C));
    std::cout << "class " << class_name << '\n';

    constexpr auto ctx = std::meta::access_context::unchecked();
    constexpr static auto members =
        std::define_static_array(std::meta::members_of(^^C, ctx));
    template for (constexpr auto member : members)
    {
        if constexpr (std::meta::is_constructor(member))
        {
            std::cout << "  " << std::meta::display_string_of(member) << " is ";
            if constexpr (std::meta::is_default_constructor(member))
                std::cout << "default ";
            else if constexpr (std::meta::is_copy_constructor(member))
                std::cout << "copy ";
            else if constexpr (std::meta::is_move_constructor(member))
                std::cout << "move ";
            std::cout << "constructor\n";
        }
    }
}

struct C
{
    C();
    C(const C&);
    C(C&&);
    C(int);
};

int main()
{
    print_constructors<C>();
    print_constructors<std::weak_ptr<int>>();
}

Возможный вывод:

class C
  C::C() is default constructor
  C::C(const C&) is copy constructor
  C::C(C&&) is move constructor
  C::C(int) is constructor
class std::weak_ptr<int>
  constexpr std::weak_ptr<_Tp>::weak_ptr() [with _Tp = int] is default constructor
  std::weak_ptr<_Tp>::weak_ptr(const std::weak_ptr<_Tp>&) [with _Tp = int] is copy constructor
  std::weak_ptr<_Tp>::weak_ptr(std::weak_ptr<_Tp>&&) [with _Tp = int] is move constructor

См. также

is_function
(C++26)
проверяет, представляет ли отражение функцию
(функция)
is_function_type
(C++26)
проверяет, является ли отражённый тип типом функции
(функция)
is_special_member_function
(C++26)
проверяет, представляет ли отражение специальную функцию-член
(функция)
is_invocable_typeis_invocable_r_typeis_nothrow_invocable_typeis_nothrow_invocable_r_type
(C++26)(C++26)(C++26)(C++26)
проверяет, можно ли вызвать отражённый тип (как если бы с помощью std::invoke) с заданными типами аргументов
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/is_constructor

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API