Информация об изменениях

Сообщение Re[7]: Можно ли сделать универсальный шаблон для разных комб от 20.01.2023 9:38

Изменено 20.01.2023 10:12 rg45

Re[7]: Можно ли сделать универсальный шаблон для разных комб
Здравствуйте, Евгений Музыченко, Вы писали:

V>>Из описания замучаешься восстанавливать не работающий код.


ЕМ>В каком смысле "не работающий код"? Код здесь вообще ни при чем — проблема в том, что комбинация параметров шаблона (если в них явно добавлять промежуточный тип) не может быть однозначно выведена из комбинации параметров функции и ее возвращаемого типа. Получается, что решить можно только с костылями — хоть явными, хоть библиотечными. Придется их использовать.


Разумеется, нужный тебе промежуточный тип не может быть однозначно (и никак вообще) выведен, потому что правила выведения известны одному только тебе. А костыльным предложенное решение тебе видится только лишь потому, что ты не смог, или просто не удосужился, эти правила сформулировать.

Например, можно было бы сформулировать правило таким образом: "когда тип назначения (Dst) больше по рамеру, чем исходный тип (Src), выполнить промежуточное преобразование Src к беззнаковому типу, во всех остальных случаях промежуточный тип совпадает с Src". При такой формулировке, утилиту преобразования типов, предложенную здесь
Автор: Videoman
Дата: 19.01.23
, можно было бы переписать более универсально:

template <typename dst_t, typename src_t, typename = void>
struct s_trait_t
{
    using type = src_t;
};

template <typename dst_t, typename src_t>
struct s_trait_t<dst_t, src_t, std::enable_if_t<(sizeof(dst_t) > sizeof(src_t))>>
{
    using type = std::make_unsigned_t<src_t>;
};


Вообще, самых разных реализаций здесь можно придумать вагон и маленькую тележку, в зависимости от ТВОИХ требований.
Re[7]: Можно ли сделать универсальный шаблон для разных комб
Здравствуйте, Евгений Музыченко, Вы писали:

V>>Из описания замучаешься восстанавливать не работающий код.


ЕМ>В каком смысле "не работающий код"? Код здесь вообще ни при чем — проблема в том, что комбинация параметров шаблона (если в них явно добавлять промежуточный тип) не может быть однозначно выведена из комбинации параметров функции и ее возвращаемого типа. Получается, что решить можно только с костылями — хоть явными, хоть библиотечными. Придется их использовать.


Разумеется, нужный тебе промежуточный тип не может быть однозначно (и никак вообще) выведен, потому что правила выведения известны одному только тебе. А костыльным предложенное решение тебе видится только лишь потому, что ты не смог, или просто не удосужился, эти правила сформулировать.

Например, можно было бы сформулировать правило таким образом: "когда тип назначения (Dst) больше по рамеру, чем исходный тип (Src), выполнить промежуточное преобразование Src к беззнаковому типу, во всех остальных случаях промежуточный тип совпадает с Src". При такой формулировке, утилиту преобразования типов, предложенную здесь
Автор: Videoman
Дата: 19.01.23
, можно было бы переписать более универсально:

template <typename dst_t, typename src_t, typename = void>
struct s_trait_t
{
    using type = src_t;
};

template <typename dst_t, typename src_t>
struct s_trait_t<dst_t, src_t, std::enable_if_t<(sizeof(dst_t) > sizeof(src_t))>>
{
    using type = std::make_unsigned_t<src_t>;
};


Вообще, самых разных реализаций здесь можно придумать вагон и маленькую тележку, но все только в зависимости от ТВОИХ требований.