Указатели на свободные функции обрабатываются иначе, чем указатели на функции-члены.Тип TVoidVoid
является указателем на свободную функцию, но вам нужен указатель на функцию-член Foo
.Следовательно, сначала определите Foo
,
class Foo { /* As before... */ };
, затем с псевдонимом типа для функции-члена (Foo
должно быть известно на этом этапе)
// Note the different syntax to the former TVoidVoid
using FooVoidVoid = void (Foo::*)();
Затем Bar
необходимо настроить так, чтобы его элемент данных имел тип FooVoidVoid
, и конструктор принимает этот тип в качестве аргумента (оставшуюся часть Bar
можно оставить как есть), и, наконец, определилмассив как
std::array<Bar, 3> bar_array = {{Bar{}, Bar{&Foo::myHandler}}};
Обратите внимание, что &Foo::myHandler
не имеет никакого отношения к любому существующему экземпляру Foo
.Это просто указатель на функцию-член Foo
, и только когда вы вызываете ее, она должна быть объединена с объектом Foo
(специальные операторы .*
и ->*
предназначены для этого или используютstd::invoke
после обновления до компилятора с поддержкой C ++ 17.