К сожалению, запрашиваемое вами ограничение невозможно. Ограничения доступа присутствуют только во время компиляции, а не во время выполнения; единственное, что они делают, это контролируют (на основе лексическая область действия), на какие идентификаторы можно ссылаться.
Поскольку вызывающий контекст, производящий эти связанные функции-члены, очевидно, имеет доступ ко всем его функциям-членам, вы не можете различить приватные и публичные функции-члены локально - это исключает любые макро-взломы. Кроме того, указатели на функции-члены не сохраняют информацию об управлении доступом (поэтому вы можете вызывать указатель на приватную функцию-член из другого класса). Таким образом, проверка в другом месте также невозможна.
Вы можете реализовать это как передачу компилятором чего-то вроде clang , так как информация доступна там во время компиляции; однако это невозможно с обычным компилятором C ++. Однако это может быть склонно к ложным срабатываниям и ложным отрицаниям, так как ситуация, в которой это проблема, является несколько плохо определенной (что если некоторый производный класс B
действительно хочет связанную публичную функцию-член, что он будет использовать в другом месте?)