템플릿 typename 인수에 대한 참조를 전달하는 방법


15

템플릿 typename 인수에 인수로 참조를 전달하는 방법이 있습니까? 예를 들어 int에 대한 참조를 전달하기 위해 int를 전달하는 대신 의미합니다.

template <typename T>
struct Foo
{
    Foo(T arg) : ptr(arg) {}
    T ptr;
};

int main() 
{
    int* a = new int(6);
    Foo<decltype(a)> foo1(a); // ptr is a copy of a pointer
    Foo<decltype(&a)> foo1(&a); // ptr seems to be a pointer to a pointer
}

클래스에서 T & T로 만들어 'ptr'멤버를 포인터에 대한 참조로 만들 수 있다는 것을 알고 있지만 템플릿 인수에 전달 된 인수 에서이 작업을 수행 할 수 있는지 궁금합니다.


decltype제목 그대로 문자 그대로 쓸 수 있기 때문에 계속 머무르고 싶다고 생각합니다.Foo<int*&>
idclev 463035818

답변:


18

찾고 있습니다 Foo<decltype(a) &> foo1(a).

더 모호한 대안 (이 특정 사례에서 작동)은 Foo<decltype((a))> foo1(a)입니다.


1
아 이해가 되네요, 고마워요 decltype ((a))의 이중 괄호는 어떻게 작동합니까? 그것이 어떻게 참조가됩니까?
Zebrafish

2
@Zebrafish 기본적으로 decltype변수 이름이나 다른 이름 (임의의 표현)을 제공하는지에 따라 다르게 작동합니다. decltype(a)변수의 유형을 반환 a하기 때문에 변수의 유형을 반환합니다 . decltype((a))반면에, 의 값 범주를 나타내는 참조가 추가 된 의 유형 (a)()도 제공 int합니다. [1/2]
HolyBlackCat

(a)(뿐만 아니라 a)는 lvalue로 표시됩니다 &(xvalues는로 표시되며 &&prvalue는 유형을 전혀 변경하지 않음). 표현식에는 참조 유형이 없으므로 유형 decltype에 참조를 추가 할 수 있다는 사실로 인해 충돌이 발생하지 않습니다. [2/2]
HolyBlackCat

2

이전 답변의 대안으로 std :: reference_wrapper를 사용할 수 있습니다.

std :: reference_wrapper는 참조를 복사 가능하고 할당 가능한 객체로 래핑하는 클래스 템플릿입니다. 일반적으로 참조를 보유 할 수없는 표준 컨테이너 (예 : std :: vector) 내에 참조를 저장하는 메커니즘으로 자주 사용됩니다.

#include <functional>

template <typename T>
struct Foo
{
  Foo(T arg) : ptr(arg)
  {
  }
  T ptr;
};

int main()
{
  int* a = new int(6);

  Foo<std::reference_wrapper<int*>> foo1(std::ref(a));
  foo1.ptr[0] = 1;  // ok

  // This also works
  int* b = new int(6);
  Foo<std::reference_wrapper<decltype(b)>> foo2(std::ref(b));
  // and this too
  foo1 = foo2;

  // Or, if you use c++17, even this
  Foo foo3(std::ref(b));
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.