If I have a class Foo in namespace bar:
namespace bar { class Foo { ... } };
I can then:
using Baz = bar::Foo;
and now it is just like I defined the class in my namespace with the name Baz.
Is it possible to do the same for functions?
namespace bar { void f(); }
And then:
using g = bar::f; // error: ‘f’ in namespace ‘bar’ does not name a type
What is the cleanest way to do this?
The solution should also hold for template functions.
Definition: If some entity B is an alias of A, than if any or all usages (not declarations or definitions of course) of A are replaced by B in the source code than the (stripped) generated code remains the same. For example typedef A B
is an alias. #define B A
is an alias (at least). T& B = A
is not an alias, B can effectively implemented as an indirect pointer, wheres an "unaliased" A can use "immediate semantics".
You can define a function alias (with some work) using perfect forwarding:
template <typename... Args> auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) { return f(std::forward<Args>(args)...); }
This solution does apply even if f
is overloaded and/or a function template.
The constexpr
function pointer can be used as a function alias.
namespace bar { int f(); } constexpr auto g = bar::f;
It is highly likely (but not guaranteed by the language) that using g
uses bar::f
directly. Specifically, this depends on compiler version and optimization level.
In particular, this is the case for:
See assembly generated by these compilers.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With