【发布时间】:2012-04-09 11:37:25
【问题描述】:
如果我在命名空间栏中有一个类 Foo:
namespace bar
{
class Foo { ... }
};
然后我可以:
using Baz = bar::Foo;
现在就像我在命名空间中使用名称 Baz 定义的类一样。
是否可以对函数做同样的事情?
namespace bar
{
void f();
}
然后:
using g = bar::f; // error: ‘f’ in namespace ‘bar’ does not name a type
最干净的方法是什么?
该解决方案也应该适用于模板函数。
定义:如果某个实体 B 是 A 的 别名,那么如果 A 的任何或所有用法(当然不是声明或定义)在源代码比(剥离)生成的代码保持不变。例如typedef A B 是一个别名。 #define B A 是一个别名(至少)。 T& B = A 不是别名,B 可以有效地实现为间接指针,而“未别名”的 A 可以使用“立即语义”。
【问题讨论】:
-
@DavidRodríguez-dribeas:上面的“别名”是什么意思几乎没有混淆。一般来说,如果 B 是 A 的别名,那么如果将 A 的用法替换为 B,则生成的代码将保持不变。为什么你想要这个也很简单。我想为库函数提供第二个名称/命名空间。我怀疑最干净的方法是使用新名称的 always_inline 函数包装对旧名称的调用。包装器将被编译出来,根据需要留下一些与直接调用旧名称没有区别的东西。
-
@DavidRodríguez-dribeas:函数指针会产生与普通函数调用不同的代码,因为函数指针需要在调用之前取消引用。
-
@DavidRodríguez-dribeas:再说一次,生成的代码。请参阅上面我定义别名含义的第二条评论。
-
@DavidRodríguez-dribeas:在什么情况下将函数调用包装在内联函数中的解决方案不会产生相同的生成代码?
-
@DavidRodríguez-dribeas:正如我所说的“always_inline”指的是强制内联的属性。请参阅 GCC 手册中的 6.39 内联函数与宏一样快部分。