LINUX.ORG.RU

История изменений

Исправление bonta, (текущая версия) :

Какие хелперы имеется в виду? Что они делают?

Хелперы - это просто так принято называть вспомогательные сущности в коде, которые используются в работе той сущности которую предоставляет библиотека.

Вот пример std::is_member_pointer (https://en.cppreference.com/w/cpp/types/is_member_pointer) и хелперов на которых она реализована

  template<typename _Tp>
    struct __is_member_pointer_helper
    : public false_type { };

  template<typename _Tp, typename _Cp>
    struct __is_member_pointer_helper<_Tp _Cp::*>
    : public true_type { };

  template<typename _Tp>
    struct is_member_pointer
    : public __is_member_pointer_helper<__remove_cv_t<_Tp>>::type
    { };

(https://github.com/gcc-mirror/gcc/blob/master/libstdc -v3/include/std/type_t...)

Я так и не понял, каким образом защищаются типы? Как разрешить только нужные тебе типы?

Передаваемые типы проверяются на этапе компиляции, не в рантайме, компилятором. В принципе это будет работать даже для полиморфизма т.к. компилятор всегда может понять что этот тип наследник или базовый... Но для полиморфизма скорее всего нужно будет добавить сравнение через is_convertible

//что-то типа
template <typename T> using RequireOnlyCharOrWideCharSymbol =
typename std::enable_if<metaOr<
        std::is_same<T, char>,
        std::is_same<T, wchar_t>
>::value>::type;

//дальше это можно использовать при объявлении ф-ии или класса, пример для класса
template <typename SymbolType = wchar_t,
          size_t BufferSize = 0,
          typename = TemplateMagick::RequireOnlyCharOrWideCharSymbol<SymbolType>>
class SomeClass {
...

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

Ну и соотеветственно если в метод суются нужные типы то код компиляется и работает, если нет то на этапе компиляции будет выдана ошибка, хотя формально код бы смог скомпилироваться и работать. Т.е. это просто искусственное ограничение области применения своего кода получается.

Правда для для того чтобы это работало нужно опираться на класс MetaOr - например у меня он свой, ну как сворй - грубо говоря это копипаст из STL из GCC. Почему так - потому что например тот же std::is_same это стандартная ф-я библиотеки, а мета ф-ии логических операторов (н.у. т.е. and, or времени компиляции а не рантайма) на момент когда я эту тему изучал не были стандартными (хотя всюду где я их смотрел были реализованы одинаково), ну и я решил их просто закопипастить в свой хедер и когда мне надо подключать его к своим проектам и опираться на этот хедер, чем опираться на код, который в другой реализации STL может быть изменен, например вместо __or_ станет называться _or_, хотя тело будет скорее всего тоже самое, т.к. там базовые вещи и как-то по другому их реализовать скорее всего нельзя.

Исправление bonta, :

Какие хелперы имеется в виду? Что они делают?

Хелперы - это просто так принято называть вспомогательные сущности в коде, которые используются в работе той сущности которую предоставляет библиотека.

Вот пример std::is_member_pointer (https://en.cppreference.com/w/cpp/types/is_member_pointer) и хелперов на которых она реализована

  template<typename _Tp>
    struct __is_member_pointer_helper
    : public false_type { };

  template<typename _Tp, typename _Cp>
    struct __is_member_pointer_helper<_Tp _Cp::*>
    : public true_type { };
  /// @endcond

  template<typename _Tp>
    struct is_member_pointer
    : public __is_member_pointer_helper<__remove_cv_t<_Tp>>::type
    { };
#endif

(https://github.com/gcc-mirror/gcc/blob/master/libstdc -v3/include/std/type_t...)

Я так и не понял, каким образом защищаются типы? Как разрешить только нужные тебе типы?

Передаваемые типы проверяются на этапе компиляции, не в рантайме, компилятором. В принципе это будет работать даже для полиморфизма т.к. компилятор всегда может понять что этот тип наследник или базовый... Но для полиморфизма скорее всего нужно будет добавить сравнение через is_convertible

//что-то типа
template <typename T> using RequireOnlyCharOrWideCharSymbol =
typename std::enable_if<metaOr<
        std::is_same<T, char>,
        std::is_same<T, wchar_t>
>::value>::type;

//дальше это можно использовать при объявлении ф-ии или класса, пример для класса
template <typename SymbolType = wchar_t,
          size_t BufferSize = 0,
          typename = TemplateMagick::RequireOnlyCharOrWideCharSymbol<SymbolType>>
class SomeClass {
...

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

Ну и соотеветственно если в метод суются нужные типы то код компиляется и работает, если нет то на этапе компиляции будет выдана ошибка, хотя формально код бы смог скомпилироваться и работать. Т.е. это просто искусственное ограничение области применения своего кода получается.

Правда для для того чтобы это работало нужно опираться на класс MetaOr - например у меня он свой, ну как сворй - грубо говоря это копипаст из STL из GCC. Почему так - потому что например тот же std::is_same это стандартная ф-я библиотеки, а мета ф-ии логических операторов (н.у. т.е. and, or времени компиляции а не рантайма) на момент когда я эту тему изучал не были стандартными (хотя всюду где я их смотрел были реализованы одинаково), ну и я решил их просто закопипастить в свой хедер и когда мне надо подключать его к своим проектам и опираться на этот хедер, чем опираться на код, который в другой реализации STL может быть изменен, например вместо __or_ станет называться _or_, хотя тело будет скорее всего тоже самое, т.к. там базовые вещи и как-то по другому их реализовать скорее всего нельзя.

Исходная версия bonta, :

Какие хелперы имеется в виду? Что они делают?

Хелперы - это просто так принято называть вспомогательные сущности в коде, которые используются в работе той сущности которую предоставляет библиотека.

Вот пример std::is_member_pointer (https://en.cppreference.com/w/cpp/types/is_member_pointer) и хелперов на которых она реализована

  template<typename _Tp>
    struct __is_member_pointer_helper
    : public false_type { };

  template<typename _Tp, typename _Cp>
    struct __is_member_pointer_helper<_Tp _Cp::*>
    : public true_type { };
  /// @endcond

  template<typename _Tp>
    struct is_member_pointer
    : public __is_member_pointer_helper<__remove_cv_t<_Tp>>::type
    { };
#endif

(https://github.com/gcc-mirror/gcc/blob/master/libstdc -v3/include/std/type_t...)

Я так и не понял, каким образом защищаются типы? Как разрешить только нужные тебе типы?

Передаваемые типы проверяются на этапе компиляции, не в рантайме, компилятором. В принципе это будет работать даже для полиморфизма т.к. компилятор всегда может понять что этот тип наследник или базовый... Но для полиморфизма скорее всего нужно будет добавить сравнение через is_convertible

//что-то типа
template <typename T> using RequireOnlyCharOrWideCharSymbol =
typename std::enable_if<metaOr<
        std::is_same<T, char>,
        std::is_same<T, wchar_t>
>::value>::type;

//дальше это можно использовать при объявлении ф-ии или класса, пример для класса
template <typename SymbolType = wchar_t,
          size_t BufferSize = 0,
          typename = TemplateMagick::RequireOnlyCharOrWideCharSymbol<SymbolType>>
class SomeClass {
...

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

Ну и соотеветственно если в метод суются нужные типы то код компиляется и работает, если нет то на этапе компиляции будет выдана ошибка, хотя формально код бы смог скомпилироваться и работать. Т.е. это просто искусственное ограничение области применения своего кода получается.

Правда для для того чтобы это работало нужно опираться на класс MetaOr - например у меня он свой, ну как сворй - грубо говоря это копипаст из STL из GCC. Почему так - потому что например тот же std::is_same это стандартная ф-я библиотеки, а мета ф-ии логических операторов (н.у. т.е. and, or времени компиляции а не рантайма) на момент когда я эту тему изучал не были стандартными (хотя всюду где я их смотрел были реализованы одинаково), ну и я решил их просто закопипастить в свой хедер и когда мне надо опираться на этот хедер, чем опираться на код, который в другой реализации STL может быть изменен, например вместо __or_ станет называться _or_, хотя тело будет скорее всего тоже самое, т.к. там базовые вещи и как-то по другому их реализовать скорее всего нельзя.