/ / C ++ Як перевірити тип варіантної карти під час компіляції - c ++, шаблон-метапрограмування, варіант

C ++ Як перевірити тип варіантної карти під час компіляції - c + +, шаблон-мета-програмування, варіант

Я хотів би мати карту ключових, пар значень; ключі можуть бути реалізовані у вигляді рядка або перерахунку; але значення повинні підтримувати кілька типів, наприклад 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::strings, тоді нічого не буде перевірено під час компіляції, як std::strings передбачають розподіл купи.