And*_*zos 61 c++ linux gcc c++11
如果我在命名空间栏中有一个类Foo:
namespace bar
{
class Foo { ... }
};
Run Code Online (Sandbox Code Playgroud)
那我可以:
using Baz = bar::Foo;
Run Code Online (Sandbox Code Playgroud)
现在就像我在名称空间中使用名称Baz定义类一样.
是否有可能为功能做同样的事情?
namespace bar
{
void f();
}
Run Code Online (Sandbox Code Playgroud)
然后:
using g = bar::f; // error: ‘f’ in namespace ‘bar’ does not name a type
Run Code Online (Sandbox Code Playgroud)
最干净的方法是什么?
解决方案还应该适用于模板功能.
定义:如果某个实体B是A 的别名,那么与源代码中的B替换A的任何或所有用法(当然不是声明或定义)相比,(剥离的)生成的代码保持不变.例如typedef A B
是别名. #define B A
是一个别名(至少). T& B = A
不是别名,B可以有效地实现为间接指针,一个"unaliased"A可以使用"立即语义".
Jer*_*ock 64
您可以使用完美转发定义函数别名(有一些工作):
template <typename... Args>
auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
return f(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
即使f
过载和/或功能模板,此解决方案也适用.
Ker*_* SB 20
类类型的,所以它们可以与别名typedef
和using
(在C++ 11).
函数更像是对象,因此没有别名的机制.充其量你可以使用函数指针或函数引用:
void (*g)() = &bar::f;
void (&h)() = bar::f;
g();
h();
Run Code Online (Sandbox Code Playgroud)
同样,没有别名变量的机制(通过指针或引用).
Paw*_*ica 17
的constexpr
函数指针可以用作函数别名.
namespace bar
{
int f();
}
constexpr auto g = bar::f;
Run Code Online (Sandbox Code Playgroud)
在使用别名的位置,即使在没有任何优化的情况下进行编译,编译器也会调用别名函数.
使用GCC7以下用法
int main()
{
return g();
}
Run Code Online (Sandbox Code Playgroud)
变
main:
push rbp
mov rbp, rsp
call bar::f() # bar::f() called directly.
pop rbp
ret
Run Code Online (Sandbox Code Playgroud)
程序集在Compiler Explorer中生成.
Mar*_*ork 15
绝对:
#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);
}
Run Code Online (Sandbox Code Playgroud)
尝试:
> g++ a.cpp
> ./a.out
Test
Test
Test: 3
>
Run Code Online (Sandbox Code Playgroud)
引用是现有对象的别名.
我刚刚创建了一个函数的引用.引用可以与原始对象完全相同的方式使用.
Jas*_*lam 11
可以将函数引入不同的范围而不更改其名称.因此,您可以使用不同的限定名称对函数进行别名:
namespace bar {
void f();
}
namespace baz {
using bar::f;
}
void foo() {
baz::f();
}
Run Code Online (Sandbox Code Playgroud)
它不是标准的C++,但大多数编译器提供了这样做的方法.使用GCC,您可以这样做:
void f () __attribute__ ((weak, alias ("__f")));
Run Code Online (Sandbox Code Playgroud)
这会将符号创建f
为别名__f
.使用VC++,你可以这样做:
#pragma comment(linker, "/export:f=__f")
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
33773 次 |
最近记录: |