стандарта C++ говорит:
7.1.3 ЬурейеЕ спецификатор
Имя объявляется с ЬурейиМ спецификатором становится именем ЬурейиМ. В пределах своей декларации имя typedef равно , синтаксически эквивалентное ключевому слову, и называет тип, связанный с идентификатором, в способом, описанным в разделе 8. Typedef-name , таким образом, является синонимом другого типа. A-имя ЬурейеЕ делает не вводит нового типа, как класс декларации (9.1) или декларации перечислимую делает
Но, например, class
или struct
ввести новые типы. В следующем примере uniqueUnused
фактически ничего не используется, но используется для создания другого типа Value<int, 1> != Value<int, 2>
. Так что, возможно, это то, что вы ищете. Имейте в виду, что нет гарантии, что компилятор избавится от внешней структуры! Единственная гарантия этот код дает вам это тот же размер, как ИНТ
template<typename T, int uniqueUnused>
struct Value
{
Value() : _val({}) {}
Value(T val) : _val(val) { }
T _val;
operator T&() { return _val; }
// evaluate if you with or without refs for assignments
operator T() { return _val; }
};
using Foo = Value<int, 1>;
using Bar = Value<int, 2>;
static_assert(sizeof(Foo) == sizeof(int), "int must be of same size");
static_assert(sizeof(Bar) == sizeof(int), "int must be of same size");
Если вы хотите создать новый тип, основанный на классе вы можете просто пойти с этим примером (это не работает со скалярными типами, начиная с вы не можете наследовать от Интс):
class Foo : public Bar // introduces a new type called Foo
{
using Bar::Bar;
};
определения типов не являются реальными типами, они просто Shorthands или псевдонимы для реальных типов. – Barmar
Так что 'foo' и' bar' на самом деле одного типа, и никакого преобразования не требуется. – Barmar
Да, это понятно. Но имеет ли современный C++ замену, которая создает новый тип без кучи шаблона? –