У вас запутанный и очень частичный механизм отражения во время выполнения. Я уверен, что вам очень больно с этим материалом ... поэтому в первую очередь следует подумать:
- Вам это действительно нужно? Если вы можете избежать этого и придерживаться рефлексии во время компиляции, это облегчит вам жизнь; или
- C ++ - тот язык, который вы хотите использовать? Если вы только начинаете свой проект программирования и этот вид полиморфизма времени выполнения критичен для вас, возможно, другой язык (например, интерпретируемый язык?) Может быть более подходящим.
Наличие сказал, что - во многих случаях вы можете быть удовлетворены собственным типом варианта C ++: std::variant
, представленным в C ++ 17 вместе с std::visit
, и шаблонным посетителем (как в этот вопрос - но с двумя шаблонами).
Вот как это будет выглядеть:
#include <variant>
#include <iostream>
#include <string>
int main() {
using variant_type = std::variant<int, float, std::string>;
variant_type v1{"hello world!"};
variant_type v2{3.14f};
std::visit([](auto&& x, auto&& y) {
// I used this as a stub:
//
// std::cout << x << " , " << y << '\n';
//
// but you want:
call(func_name, x, y);
}, v1, v2);
}
GodBolt
Но есть одно предостережение - это не извлечет c_str()
из ваших строк. Если вы хотите сделать это, вы можете сделать одно из двух:
- Сохраните
const char*
в варианте для начала. - вместо передачи
x
и y
, у вас может быть шаблонная функция-преобразователь, которая обычно ничего не делает, но применяет .c_str()
для ссылок на константные строки.
но мне не очень нравится второй подход.