Карты сигнатур различных указателей функций, хранящихся на одной карте

#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