2017-04-10 2 views
3

최근 동적 메모리 할당을 배우고 있습니다.이터레이터 매개 변수를 사용하여 템플릿 함수에서 포인터를 반환

연습용으로 매개 변수로 반복자를 받아 들일 수있는 보편적 인 함수를 만들고 나서 처음부터 끝까지 동적으로 할당 된 배열로 복사 한 다음 포인터를 반환했습니다.

함수를 호출 할 때 반환 형식을 지정하지 않고 완전한 공제를 사용하여 함수를 만들고 싶습니다.

가능하면 라이브러리 없이도 (가능한 경우 간단하게 std::remove_reference에서 type_traits까지) 기능 선언을 간단하게하고 싶습니다.

다음 코드는 컴파일되지 않습니다. 그리고 그 코드는 논리적 인 관점에서 쓸모가 없다는 것을 압니다. 난 그냥 당신이 내 의도를 보여주고 싶었다 내가 달성하기 위해 원하는 것을 ... 내가 늘 컴파일 왜, 내가 알아낼 수있는 일이 내가 상상하는 방법을 제대로 사용하는 방법을

#include <iostream> 
#include <vector> 
#include <type_traits> 

template<typename T> 
auto* returnPointer(T iter1, T iter2) -> std::remove_reference<decltype(*iter1)>::type 
{ 
    auto p = new std::remove_reference<decltype(*iter1)>::type [10]; 
    auto p_help = p; 

    while(iter1 != iter2) 
    { 
     *p_help = *iter1; 
     p_help++; 
     iter1++; 
    } 

    return p; 
} 

int main() 
{ 
    std::vector<int> v {0,1,2,3,4,5,6,7,8,9}; 
    int *p = returnPointer(v.begin(), v.end()); 

    for(int i = 0; i < 10; i++) 
     std::cout << p[i] << " "; 

    return 0; 
} 

...

어떤 도움을 주셔서 감사합니다. :)

답변

3
  1. 후행 반환 형식 선언을 사용하는 경우 auto을 직접 사용해야합니다.
  2. std::remove_reference<...>::typetypename을 추가하거나 std::remove_reference_t (C++ 14 이후)을 사용해야합니다.

그런

auto returnPointer(T iter1, T iter2) -> typename std::remove_reference<decltype(*iter1)>::type* 
// ~         ~~~~~~~~            ~ 

LIVE


다른 제안 : C++ (14)는 반환 형식 공제를 활용할 수 있기 때문에

  1. . 그래서 그냥

    template<typename T> 
    auto returnPointer(T iter1, T iter2) 
    { 
        auto p = new std::remove_reference_t<decltype(*iter1)> [10]; 
        ... 
        return p; // return type will be deduced from p 
    } 
    
  2. 당신은 즉, delete[] 지난에서 포인터를 잊지 마세요

    auto p = new std::remove_reference_t<decltype(*iter1)> [std::distance(iter1, iter2)]; 
    
  3. 처럼 요소의 수를 얻기 위해

    delete[] p; 
    
std::distance을 사용할 수 있습니다

LIVE

+0

나는 가까이에 있었다! 놀랄 만한! 나는 하나의 장소, 배열을 할당하고 있던 곳에서'typename'을 잊어 버렸습니다. 방금 테스트했는데 작동합니다! 감사! 'type '뒤에'*'뒤에 숨어있는 비밀이 무엇인지 설명해 주시겠습니까? – galaxyworks

+1

@galaxyworks 그것은 간단합니다.'std :: remove_reference <...> :: type'은 요소의 타입을 반환 할 것이고,'*'를 추가하면 요소에 대한 포인터의 타입이됩니다. 당신이'std :: vector '코드를 사용하면'std :: remove_reference <...> :: type'은'int'가 될 것이고,'*'를 추가하면'int *'가됩니다. – songyuanyao

+0

이제 알겠습니다! 대답과 상세한 설명에 감사드립니다! – galaxyworks