Я хочу использовать строки типа RTTI и искаженной функции (указателя).
Прежде чем вы классифицируете это как проблему XY, я знаю, что есть лучшие варианты привязки функций с использованием полиморфизма и т. д.
Это чисто академический вопрос, как правильно использовать typeid()
с указателями функций, которые должны отличаться своими юридически перегруженными сигнатурами.
Если я использую следующий код, похоже, я могу получить уникальные значения typeinfo::name()
для различных пространств имен. /типы:
#include <iostream>
#include <typeinfo>
#include <string>
void foo(int) {
}
namespace woozle {
void goozle(int) {}
}
struct bar {
void baz(int) {}
static void boo(int) {}
};
int main() {
std::cout << typeid(&foo).name() << std::endl;
std::cout << typeid(&woozle::goozle).name() << std::endl;
std::cout << typeid(&bar::baz).name() << std::endl;
std::cout << typeid(&bar::boo).name() << std::endl;
}
Результат:
PFviE PFviE M3barFviE PFviE
Совершенно то, что я ожидал (я предполагаю, что i
в искаженном имени относится к сигнатуре параметра).
Теперь я хочу иметь что-то вроде этого (что является совершенно законной перегрузкой функций):
#include <iostream>
#include <typeinfo>
#include <string>
void foo(int) {
}
void foo(std::string) {
}
namespace woozle {
void goozle(int) {}
void goozle(std::string) {}
}
struct bar {
void baz(int) {}
static void boo(int) {}
void baz(std::string) {}
static void boo(std::string) {}
};
int main() {
std::cout << typeid(&foo).name() << std::endl;
std::cout << typeid(&woozle::goozle).name() << std::endl;
std::cout << typeid(&bar::baz).name() << std::endl;
std::cout << typeid(&bar::boo).name() << std::endl;
}
и, конечно же, компилятор жалуется на двусмысленность:
main.cpp: In function 'int main()': main.cpp:24:25: error: address of overloaded function with no contextual type information std::cout << typeid(&foo).name() << std::endl; ^~~~ main.cpp:25:25: error: address of overloaded function with no contextual type information std::cout << typeid(&woozle::goozle).name() << std::endl; ^~~~~~~ main.cpp:26:25: error: address of overloaded function with no contextual type information std::cout << typeid(&bar::baz).name() << std::endl; ^~~~ main.cpp:27:25: error: address of overloaded function with no contextual type information std::cout << typeid(&bar::boo).name() << std::endl; ^~~~
TL;DR
Каков правильный синтаксис для указания конкретной перегрузки функции с помощью typeid()
(если есть)?
Как я могу предоставить информацию о контекстном типе, которая требуется из сообщения об ошибке?
Я пришел из здесь в режиме глубокого размышления.