Friday, 28 April 2017

c++ - C++11: How to alias a function?



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".


Answer



You can define a function alias (with some work) using perfect forwarding:



template 
auto g(Args&&... args) -> decltype(f(std::forward(args)...)) {
return f(std::forward(args)...);
}



This solution does apply even if f is overloaded and/or a function template.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...