Lo standard C++ dice:
7.1.3 Il typedef specificatore
Un nome dichiarato con lo specificatore typedef diventa un nome-typedef. Nell'ambito della sua dichiarazione, un typedef-name è sintatticamente equivalente a una parola chiave e nomina il tipo associato all'identificatore in come descritto nella Clausola 8. Un nome typedef è quindi un sinonimo per un altro tipo. Un nome-typedef non non introduce un nuovo tipo il modo in cui una dichiarazione di classe (9.1) o di dichiarazione enum fa
Ma per esempio class
o struct
introdurre nuovi tipi. Nell'esempio seguente, uniqueUnused
non viene utilizzato per creare un diverso tipo Value<int, 1> != Value<int, 2>
. Quindi forse questo è qualcosa che stai cercando. Ricorda che non c'è alcuna garanzia che il compilatore si liberi della struttura esterna! L'unica garanzia di questo codice ti dà è la stessa dimensione di int
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");
Se si desidera creare un nuovo tipo basato su una classe si può semplicemente andare con questo esempio (questo non funziona con i tipi scalari dal non si può ereditare da interi):
class Foo : public Bar // introduces a new type called Foo
{
using Bar::Bar;
};
typedef non sono tipi reali, sono solo abbreviazioni o alias per i tipi reali. – Barmar
Quindi 'foo' e' bar' sono in realtà lo stesso tipo e non ci sono conversioni. – Barmar
Sì, è chiaro. Ma il C++ moderno ha un rimpiazzo che crea un nuovo tipo senza un mazzo di piastre? –