C ++ 11:如何别名的function?

如果我在命名空间栏中有一个Foo类:

namespace bar { class Foo { ... } }; 

那么我可以:

 using Baz = bar::Foo; 

现在它就像我在名字空间中用Baz这个名字定义了这个类。

是否有可能做同样的function?

 namespace bar { void f(); } 

接着:

 using g = bar::f; // error: 'f' in namespace 'bar' does not name a type 

最干净的方法是什么?

解决scheme也应该适用于模板function。

定义:如果某个实体B是A的别名 ,比源代码中B的任何或所有用法(不是声明或当然定义)都被replace为B(被剥离)生成的代码保持不变。 例如typedef AB是一个别名。 #define BA是一个别名(至less)。 T& B = A不是别名,B可以有​​效地实现为间接指针,而“非混淆”A可以使用“即时语义”。

你可以使用完美的转发来定义一个函数别名(有一些工作):

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

即使f超载和/或函数模板,该解决scheme也适用。

类是types ,所以它们可以用typedef和(在C ++ 11中) using别名。

函数更像对象 ,所以没有机制来混淆它们。 最好你可以使用函数指针或函数引用:

 void (*g)() = &bar::f; void (&h)() = bar::f; g(); h(); 

同样,没有别名variables的机制(通过指针或引用)。

绝对:

 #include <iostream> namespace Bar { void test() { std::cout << "Test\n"; } template<typename T> void test2(T const& a) { std::cout << "Test: " << a << std::endl; } } void (&alias)() = Bar::test; void (&a2)(int const&) = Bar::test2<int>; int main() { Bar::test(); alias(); a2(3); } 

尝试:

 > g++ a.cpp > ./a.out Test Test Test: 3 > 

引用是现有对象的别名。
我只是创build了一个函数的引用。 引用可以以与原始对象完全相同的方式使用。

这不是标准的C ++,但大多数编译器提供了一个这样做的方法。 使用GCC你可以这样做:

 void f () __attribute__ ((weak, alias ("__f"))); 

这将创build符号f作为__f的别名。 用VC ++,你可以这样做:

 #pragma comment(linker, "/export:f=__f") 

可以在不改变名称的情况下将函数引入不同的范围。 所以你可以用一个不同的限定名称replace一个函数:

 namespace bar { void f(); } namespace baz { using bar::f; } void foo() { baz::f(); } 

你可以使用好的旧的macros

 namespace bar { void f(); } #define f bar::f int main() { f(); }