Skip to content

Личные определения шаблона #636

@rdb-dev

Description

@rdb-dev

Личные определения шаблона

Идея призвана сократить количество кода при многократном упоминании шаблонов с параметрами в определении какого-либо шаблона, а также улучшить его читаемость. Эти вычисляемые на этапе компиляции определения (как типы, так и constexpr-выражения) предлагается помещать в фигурных скобках сразу после закрывающей угловой скобки параметров шаблона.

Как сейчас:

template <typename T>
constexpr
std::enable_if_t
    <
      my_ns::meta<T>::is( my_ns::meta<T>::Array ),
      typename my_ns::array<typename my_ns::meta<T>::ref::type::orig, my_ns::meta<T>::dimension()>
    >
make_array ( T & src ) noexcept
{
  return my_ns::array<typename my_ns::meta<T>::ref::type::orig, my_ns::meta<T>::dimension()>( src );
}

где:
my_ns - некое пространство имён;
my_ns::meta<T> - шаблон дедукции параметров типа;
остальное более-менее интуитивно понятно (надеюсь).

Как предлагается:

template <typename T>
{
  using meta = my_ns::meta<T>;
  typedef
    std::enable_if_t<meta::is( meta::Array ), typename my_ns::array<typename meta::ref::type::orig, meta::dimension()>>
    array;
}
constexpr
array make_array ( T & src ) noexcept
{
  return array( src );
}

Как видно из примера, в предлагаемом варианте улучшается восприятие кода при использовании SFINAE.

Бонусом можно добавить общие для всех специализаций личные определения шаблона в его опережающем объявлении.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions