Многие люди называют делегатов C # более «типобезопасными», чем указатели функций C ++, и я действительно считаю, что это вводит в заблуждение. На самом деле они не более безопасны по типу, чем указатели функций C ++. Пример кода C ++ (скомпилирован в MSVS 2005 SP1):
typedef int (*pfn) (int);
int f (int) {
return 0;
}
double d (int) {
return 1;
}
int main()
{
pfn p=f; // OK
p=d; // error C2440: '=' : cannot convert from 'double (__cdecl *)(int)' to 'pfn'
p=(pfn)d;
}
Таким образом, как видно из приведенного выше примера, если не использовать «грязные хаки» для «закрытия» компилятора, несоответствие типов легко обнаруживается и сообщение компилятора легко понять. Так что это безопасность типов, как я понимаю.
Относительно "ограниченности" указателей на функции-члены. Действительно, в C ++ указатель на член не связан, указатель на функцию-член должен быть применен к
Переменная типа, которая соответствует подписи указателя члена. Пример:
class A {
public:
int f (int) {
return 2;
}
};
typedef int (A::*pmfn) (int);
int main()
{
pmfn p=&(A::f);
// Now call it.
A *a=new A;
(a->*p)(0); // Calls A::f
}
Опять же, все совершенно безопасно.