#c #union #stdmap
#c #объединения #stdmap
Вопрос:
Я хочу хранить указатели функций с разными сигнатурами на отдельных картах. Затем я хочу хранить все эти карты на одной карте. Мой текущий подход:
union sig_u {
func_signature1 fs1;
func_signature2 fs2;
};
std::map<std::string, sig_u> fs1_insts = {
{"default_function", sig_u{.fs1=amp;PointerToDefault}},
{"dummy_overloaded", sig_u{.fs1=amp;PointerToDummyOverloaded}}
};
std::map<std::string, sig_u> fs2_insts = {
{"important_function", sig_u{.fs2=amp;PointerToImportant}},
{"dummy_overloaded", sig_u{.fs2=amp;PointerToDummyOverloaded}}
};
std::map<std::string, std::map<std::string, sig_u> > signature = {
{"group1", fs1_insts},
{"group2", fs2_insts}
};
Тогда я хотел бы вызвать эти функции заданным способом:
signature["group1"]["dummy_overloaded"](...);
Есть ли лучший способ добиться такого поведения? Я довольно новичок в программировании на C . Я думал о некоторых шаблонах, но не смог найти никакого решения. Большое спасибо!
Комментарии:
1.
std::variant
может быть полезно здесь2. Откройте свою книгу по C на главе, которая объясняет, как использовать
std::variant
, и прочитайте ее. Хотя это приемлемо для простых указателей функций, безопасность типов C полностью обходится без реализации такого рода, и вам лучше точно знать, какой указатель на функцию какой, иначе демоны вылетят у всех из носа .3. контейнеры содержат элементы ровно одного типа. Если вы хотите, чтобы она содержала элементы разных типов, вам нужно «что-то дополнительное» (например
std::variant
)4. Большое спасибо! Я прочитаю о std::variant и скорректирую свой дизайн.
5. Я думаю, вам следует объяснить, ПОЧЕМУ вы хотите хранить указатели функций в картах, особенно если вы новичок в C . Кажется, что может быть совершенно другой дизайн, который лучше подходит для этого, так как это выглядит xyproblem.info