ACE имеет truncate_cast . Это в основном полезно для оптимизации кода, подобного следующему:
foo_t bar = ...;
short baz;
if (bar > SHORT_MAX)
baz = SHORT_MAX;
else
baz = static_cast<short> (bar);
Это можно заменить на:
foo_t bar = ...;
short baz = ACE_Utils::truncate_cast<short> (bar);
В зависимости от базового типа foo_t , truncate_cast полностью оптимизирует оператор if () , а также обращается к диагностике компилятора, полученной в результате сравнения подписанного и неподписанные типы. Выбор того, какой путь сделать, выполняется во время компиляции с помощью шаблонной метапрограммы.
В идеале не нужно такое приведение / усечение, если совместимые типы используются правильно, но иногда невозможно обойти несовместимые типы при работе с устаревшими интерфейсами, особенно с низкоуровневыми вызовами ОС.
Обратите внимание, что такое преобразование легко злоупотреблять, поэтому авторы прямо заявляют, что оно предназначено для внутреннего использования, и что преобразование не должно использоваться для обхода диагностики компилятора.