简体   繁体   中英

c++ class function aliases

I was wondering if there was a simple way to write an alias of a c++ class function. For instance, if I have some list container object, a logical function would be

    int list::length() { return len; }

But another logical alias that programmers might use could be

    int list::size() { return len; }

So, instead of writing both functions with their full body, is there any way to make list::size() an alias of list::length() such that it isn't a duplicate when compiled, but rather references the same function?

I've read that you can do this with #define , but I don't want to cause any confusion with other code-names somewhere totally out of scope (ie a 'size' variable).
I've also read that function pointers can fix it, but that isn't exactly an alias (since it has to apply de-referencing), nor can function pointers be given a declaration, giving it a confusing help-line to users (I would think), plus the confusion if ever I need to nest my code inside another object (I have to adjust the scope).

One of my guesses is, will the following be taken as a direct function alias by most optimizing compilers:

    inline int list::length() { return len; }
    inline int list::size() { return length(); }

Or, is there any strict 'alias' syntax for c++? (I couldn't find any - wasn't sure)
So then, what would be the most efficient way of doing this?

I've accepted the answer simply to wrap up the question, since it's only a curiosity of mine. 我接受了答案只是为了结束这个问题,因为这只是我的一个好奇心。 Anyone with good information, please add comments or answer, and I may even change my answer.

I would not use the preprocessor and #define to do this. In general preprocessor should be a last resort in C++. See this C++ FAQ on inline functions which also contains a section on the various evils of using macros of the preprocessor.

The approach I would use would be to have a function that will have several different aliases with a more complicated function and interface you would do something like the following:

int list::length(string xString, int iValue) {
  int iReturnValue = 0;  // init the return value
  //  do stuff with xString and iValue and other things
  return iReturnValue;
}

Then do something like the following for an alias.

inline int list::size(string xString, int iValue) {return length(xString, iValue);}

The inline should basically just replace the alias with the actual function call.

See also this stack overflow posting Giving a function implementation more than one name . It provides some reasons why you might not want to do this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM