c++ 람다 캡쳐




C++ 11:함수에 별칭을 지정하는 방법? (5)

완벽한 전달을 사용하여 함수 별칭을 정의 할 수 있습니다 (일부 작업 포함).

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

f 가 과부하되거나 함수 템플리트가있는 경우에도이 솔루션이 적용됩니다.

네임 스페이스 막대에 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

가장 확실한 방법은 무엇입니까?

솔루션은 템플릿 기능을 유지해야합니다.

정의 : A의 일부 또는 모든 사용법 (선언 또는 과정의 정의가 아님)이 소스 코드에서 B로 대체 된 경우 (제거 된) 생성 된 코드가 동일하게 유지되는 것보다 일부 엔티티 B가 A의 별명 인 경우 예를 들어 typedef AB 는 별칭입니다. #define BA 는 별칭입니다 (적어도). T& B = A 는 별칭이 아니며 B는 간접 포인터로 효과적으로 구현 될 수 있습니다. "별칭이없는"A는 "즉각적인 의미"를 사용할 수 있습니다.


이름을 변경하지 않고 다른 범위에 함수를 도입 할 수 있습니다. 따라서 다른 한정된 이름을 가진 함수를 별칭으로 지정할 수 있습니다 :

namespace bar {
  void f();
}

namespace baz {
  using bar::f;
}

void foo() {
  baz::f();
}

좋은 오래된 매크로를 사용할 수 있습니다.

namespace bar
{
    void f();
}

#define f bar::f

int main()
{
    f();
}

클래스는 유형 이므로 typedefusing (C ++ 11)을 별칭으로 사용할 수 있습니다.

함수는 객체 와 훨씬 유사하므로 별칭을 지정할 수있는 메커니즘이 없습니다. 기껏해야 함수 포인터 또는 함수 참조를 사용할 수 있습니다.

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

g();
h();

같은 맥락에서 포인터 변수 나 참조를 통해 부족한 별칭 변수에 대한 메커니즘이 없습니다.


constexpr 함수 포인터는 함수 별칭으로 사용할 수 있습니다.

namespace bar
{
    int f();
}

constexpr auto g = bar::f;

별칭이 사용되는 장소에서 컴파일러는 최적화없이 컴파일 할 때도 별칭 기능을 호출합니다.

GCC7에서는 다음과 같은 용도로 사용됩니다.

int main()
{
    return g();
}

된다

main:
  push rbp
  mov rbp, rsp
  call bar::f()  # bar::f() called directly.
  pop rbp
  ret

어셈블리는 Compiler Explorer 에서 생성되었습니다.





c++11