Чтобы эта строка была даже скомпилирована, вы должны будете использовать if constexpr
:
if constexpr(std::is_same<T, Car>::value) num = x.id;
Но учтите, что с вашего текущего кода, num
остается неинициализированным (и используется в следующей строкетем не менее).
Наиболее разумным способом, если вы хотите иметь возможность insert
аргументов типов T
, Car
и int
, является, вероятно, распределение функциональности между тремя перегрузками:
void insert(T x);
void insert(Car x);
void insert(int x);
И дополнительно специализировать шаблон для обоих типов Car
и int
, иначе он не будет компилироваться.
Или вы имели в виду, что Set
должен действительно приниматьэлементы всех типов?Тогда это гораздо сложнее.Прежде всего, сам метод insert
должен быть шаблонным:
template<typename T> void insert(T x);
, тогда как сам класс, скорее всего, не должен:
class Set;
(Тогда в шаблонном insert
вы можете использовать все, что было сказано о if constexpr
в этой теме.)
Далее базовый контейнер должен принимать значения всех типов, что означает, что вам нужно будет использоватьчто-то вроде map<int, std::any>
(Кстати, почему map
? Сортировка по идентификаторам, вероятно, не очень согласована, если вы храните автомобили, смешанные с целыми числами. Здесь вы можете использовать unordered_map
или даже unordered_set
со своим собственным многогранным хэшемfunction.)
И последнее, но не менее важное: потребуется некоторое время, чтобы создать минимально согласованную схему для фактического извлечения сохраненных значений.Основная проблема заключается в том, что вам придется хранить их с типом стирания, поэтому вам нужно каким-то образом вспомнить фактический тип хранимого значения - не совсем нелегким способом.
Это так?что ты пытаешься построить?