Сообщение Re[7]: Можно ли сделать универсальный шаблон для разных комб от 20.01.2023 9:38
Изменено 20.01.2023 10:12 rg45
Re[7]: Можно ли сделать универсальный шаблон для разных комб
Здравствуйте, Евгений Музыченко, Вы писали:
V>>Из описания замучаешься восстанавливать не работающий код.
ЕМ>В каком смысле "не работающий код"? Код здесь вообще ни при чем — проблема в том, что комбинация параметров шаблона (если в них явно добавлять промежуточный тип) не может быть однозначно выведена из комбинации параметров функции и ее возвращаемого типа. Получается, что решить можно только с костылями — хоть явными, хоть библиотечными. Придется их использовать.
Разумеется, нужный тебе промежуточный тип не может быть однозначно (и никак вообще) выведен, потому что правила выведения известны одному только тебе. А костыльным предложенное решение тебе видится только лишь потому, что ты не смог, или просто не удосужился, эти правила сформулировать.
Например, можно было бы сформулировать правило таким образом: "когда тип назначения (Dst) больше по рамеру, чем исходный тип (Src), выполнить промежуточное преобразование Src к беззнаковому типу, во всех остальных случаях промежуточный тип совпадает с Src". При такой формулировке, утилиту преобразования типов, предложенную здесь
Вообще, самых разных реализаций здесь можно придумать вагон и маленькую тележку, в зависимости от ТВОИХ требований.
V>>Из описания замучаешься восстанавливать не работающий код.
ЕМ>В каком смысле "не работающий код"? Код здесь вообще ни при чем — проблема в том, что комбинация параметров шаблона (если в них явно добавлять промежуточный тип) не может быть однозначно выведена из комбинации параметров функции и ее возвращаемого типа. Получается, что решить можно только с костылями — хоть явными, хоть библиотечными. Придется их использовать.
Разумеется, нужный тебе промежуточный тип не может быть однозначно (и никак вообще) выведен, потому что правила выведения известны одному только тебе. А костыльным предложенное решение тебе видится только лишь потому, что ты не смог, или просто не удосужился, эти правила сформулировать.
Например, можно было бы сформулировать правило таким образом: "когда тип назначения (Dst) больше по рамеру, чем исходный тип (Src), выполнить промежуточное преобразование Src к беззнаковому типу, во всех остальных случаях промежуточный тип совпадает с Src". При такой формулировке, утилиту преобразования типов, предложенную здесь
Автор: Videoman
Дата: 19.01.23
, можно было бы переписать более универсально:Дата: 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". При такой формулировке, утилиту преобразования типов, предложенную здесь
Вообще, самых разных реализаций здесь можно придумать вагон и маленькую тележку, но все только в зависимости от ТВОИХ требований.
V>>Из описания замучаешься восстанавливать не работающий код.
ЕМ>В каком смысле "не работающий код"? Код здесь вообще ни при чем — проблема в том, что комбинация параметров шаблона (если в них явно добавлять промежуточный тип) не может быть однозначно выведена из комбинации параметров функции и ее возвращаемого типа. Получается, что решить можно только с костылями — хоть явными, хоть библиотечными. Придется их использовать.
Разумеется, нужный тебе промежуточный тип не может быть однозначно (и никак вообще) выведен, потому что правила выведения известны одному только тебе. А костыльным предложенное решение тебе видится только лишь потому, что ты не смог, или просто не удосужился, эти правила сформулировать.
Например, можно было бы сформулировать правило таким образом: "когда тип назначения (Dst) больше по рамеру, чем исходный тип (Src), выполнить промежуточное преобразование Src к беззнаковому типу, во всех остальных случаях промежуточный тип совпадает с Src". При такой формулировке, утилиту преобразования типов, предложенную здесь
Автор: Videoman
Дата: 19.01.23
, можно было бы переписать более универсально:Дата: 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>;
};
Вообще, самых разных реализаций здесь можно придумать вагон и маленькую тележку, но все только в зависимости от ТВОИХ требований.