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(); }