То есть вы хотите, чтобы любая функция, которую вы передаете конструктору, стала вашим другом?
В строгом смысле это невозможно, потому что уровень доступа (друг или нет) является проблемой времени компиляции, и какое значение передается конструктору, вообще говоря, определяется только во время выполнения.
Таким образом, вы либо объявляете все соответствующие функции друзьями (почему бы не сделать их методами в этом случае?), Либо передаете им закрытые члены в качестве дополнительных параметров. Как это:
class Example{
private:
int variable=4;
std::function<void(int)> myNonMemberFunction;
public:
Example(void){
}
Example(std::function<void(int)> MyNonMemberFunction){
myNonMemberFunction=MyNonMemberFunction;
}
void callMyNonMemberFunction() {
myNonMemberFunction(variable);
}
};
void PrintPlop(int v){
std::cout<<"plop"<< v << std::endl;
}
int main() {
Example example(PrintPlop);
example.callMyNonMemberFunction();
}