Почему функции-члены нельзя использовать в качестве аргументов шаблона? Например, я хочу сделать так:
struct Foo {
void Bar() { // do something
}
};
template <typename TOwner, void(&func)()>
void Call(TOwner *p) {
p->func();
}
int main() {
Foo a;
Call<Foo, Foo::Bar>(&a);
return 0;
}
Я знаю, что подобное можно сделать с помощью указателей на член; ну, в большинстве случаев это достаточно круто, но мне просто любопытно, почему указатели «должны» использоваться.
Я не вижу двусмысленности в интерпретации «p-> func ()» выше. Почему стандарт запрещает нам использовать функции-члены в качестве аргументов шаблона? Мой компилятор (VC++ 2013) не разрешает даже статические функции-члены. Кто-нибудь знает причину? Или есть способ сделать то же самое без потери производительности из-за разыменования указателя?
Спасибо.
p->func()
не имеет значения во время компиляции, аFoo::Bar
относится не к типуvoid(&func)()
, а к типуvoid(TOwner::*func)()
. - person Jean-Baptiste Yunès   schedule 19.06.2015