У меня есть класс с шаблоном и я хочу хранить его специализации в контейнере.Мой вопрос заключается в том, действительно ли приведение специализированного указателя метода шаблона к указателю не шаблонного метода того же класса, который имеет ту же сигнатуру.Обратите внимание:
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
struct S {
using Method = void(S::*)();
template <typename T>
void method1() {
cout << "method1(): " << T() << endl;
}
template <typename T, typename U>
void method2() {
cout << "method2(): " << T() << ", " << U() << endl;
}
void call(string name)
{
auto method_pair = methods.find(name);
if (method_pair == methods.end()) {
cout << name << " not found" << endl;
return;
}
Method& method = method_pair->second;
(this->*method)();
}
unordered_map<string, Method> methods;
};
int main()
{
S s;
s.methods["method_int"] = &S::method1<int>;
s.methods["method_bool"] = &S::method1<bool>;
s.methods["method_int_int"] = &S::method2<int, int>;
s.methods["method_bool_int"] = &S::method2<bool, int>;
cout << boolalpha;
s.call("method_int");
s.call("method_bool");
s.call("method_int_int");
s.call("method_bool_int");
s.call("nonexistant");
return 0;
}
Вывод:
method1(): 0
method1(): false
method2(): 0, 0
method2(): false, 0
nonexistant not found
Приведенный выше код компилируется и работает нормально, без предупреждений о моей установке.Я довольно плохо знаком с указателями на функции-члены C ++ и прочитал, что приведение их может быть опасным, поэтому я спрашиваю.
Заранее спасибо.