Я хотів би мати карту ключових, пар значень; ключі можуть бути реалізовані у вигляді рядка або перерахунку; але значення повинні підтримувати кілька типів, наприклад int
або bool
Тепер я хотів би мати функцію із наступним підписом
template<typename T>
void getOption(KeyClass key_, T& value_)
Враховуючи, що карта буде постійною, чи можливо зробити функцію перевірки типу під час компіляції?
Наприклад, якщо карта на зразок {"start_time": 2, "can_abort": false}
Увімкнено помилку компіляції
bool can_abort;
getOption("start_time", can_abort);
Відповіді:
0 для відповіді № 1Якщо ви можете використовувати значення enum для своїх ключів, а типи та значення відомі під час компіляції, чому б просто не мати просту структуру?
struct options_t {
int start_time;
bool can_abort;
};
Якщо ви дійсно повинні повторити елементи різних типів, ви можете пройти повний вуду і використовувати бібліотеку Луї Діонна "Boost.Hana". багатотиповий клас карт. Все буде перевірено під час компіляції.
Крім того, якщо ви хочете більше орієнтуватися на час поведінки, і ви хочете гнучкість w.r.t. типи, які ви вставите на карті, ви можете використовувати тип стирання та зробити його, скажімо, an std::unordered_map<std::string, std::any>
. The std::any
тип утримує, ну, значення будь-якого типу; але вам належить знати, який тип спробувати витягнути з нього (якщо ви помиляєтесь, ви отримаєте виняток) - тобто ви виграли, не будете перевіряти час компіляції.
Що стосується використання варіанту - ви можете використовувати ці, але якщо ваші ключі є std::string
s, тоді нічого не буде перевірено під час компіляції, як std::string
s передбачають розподіл купи.