Ответ 1
BOOST_STRONG_TYPEDEF
, похоже, спроектирован именно для того, что вы ищете. Я считаю, что это волшебство, создавая класс и перегружая операторов, чтобы заставить его вести себя как встроенный тип, но я не рассматривал его реализацию.
Использование typedef в С++ создает псевдоним для типа.
Итак:
typedef double Length;
typedef double Mass;
создает две псевдонимы, которые могут быть перемешаны. Другими словами, мы можем передать значение типа Mass функции, ожидающей значения типа Length.
Есть ли легкий способ создания новых типов? Я бы хотел, чтобы они были вдвое ниже, но были "разными", чтобы их нельзя было использовать вместо другого.
Я бы предпочел что-то легче, чем создание нового класса или структуры. Кроме того, я знаю размеры lib в boost. Это сложнее и делает намного больше, чем мне нужно.
BOOST_STRONG_TYPEDEF
, похоже, спроектирован именно для того, что вы ищете. Я считаю, что это волшебство, создавая класс и перегружая операторов, чтобы заставить его вести себя как встроенный тип, но я не рассматривал его реализацию.
В то время как BOOST_STRONG_TYPEDEF - довольно простое решение, если вы смешиваете длины и массы в более сложные единицы (например, в физических науках), вы можете использовать Boost.Units.
Если предложение Metlasslasses (p7070) проходит (сейчас оно все еще находится в revision0), тогда мы сможем создать сильные typedefs используя пустой метакласс. Предлагаемый синтаксис:
$class strong_typedef { };
using Length = $double.as(strong_typedef);
using Mass = $double.as(strong_typedef);
Раньше мы могли видеть, что это будет С++ 20