3

C++ does not support nested function. Say I have function a and b, I want to guarantee that only a can call b, and nobody else can, is there a way of doing so?

4 Answers 4

6

There are multiple ways of doing this (none are 100% bulletproof, someone can always edit your source files), but one way would

  1. Put the function inside a class, make it private, and make the functions that you want to have the ability to call it "friends."

  2. Assuming you want function a to be callable by function b but no one else, another way would be to put a and b in their own source file together and make a static. This way, a would only be visible to entities in the same source file, but b would be visible to everyone who had it's signature.

Or 3. If you can use lambdas (i.e. your compiler supports this feature of C++11):

void a() { auto f = []() { /* do stuff */ } f(); } 
Sign up to request clarification or add additional context in comments.

4 Comments

Note that lambdas are C++11 only. (Perhaps that's why someone downvoted?)
@AndrewMarshall I don't know why though, I said "If you can use lambdas"
I don't know who downvoted it (I upvoted it), but I like Branko's method most. It seems that your methods are kind of exotic.
@JohnYang I guess I'm just an exotic kind of a guy.
4
int main() { class a { public: static void foo(){} }; a::foo(); } 

It compiles fine for me, so you can have "nested functions" in C++

Comments

3

The passkey idiom.

class KeyForB{ // private ctor KeyForB(){} friend void a(); }; void a(){ b(KeyForB()); } void b(KeyForB /*unused*/){ } 

Comments

2

No, but you can always create a function-level class. For example:

void MyFunction() { class InnerClass { public: static void InnerFunction() { } }; InnerClass::InnerFunction(); InnerClass::InnerFunction(); // ... }; 

3 Comments

I don't why other people don't like your solution (can anyone comment?), it seems to me is the easiest and most practical way of doing the job.
I didn't downvote, but FWIW, (1) this won't work if InnerFunction is a template; (2) anytime this would work, you can/should just use a lambda instead; (3) typically you break code up into functions so that you can move it out of line. Answerers/voters here naturally assume that you want to limit the callers of an ordinary out-of-line function, not (as here) simply take that function and in-line it into the scope where it's used. (This also means this approach fails if there are two callers.)
I wrote this answer before lambdas were widely supported in C++. The asker himself wrote: "C++ does not support nested function." which suggests they were not looking for "out-of-line" function. And finally, MyFunction itself can be made a template and then the template parameter used inside InnerFunction, which may or may not be enough in a specific situation.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.