2012-02-05 3 views
0

나는 형태의 구조가 있습니다전달 인자는

template<class T> 
    void do_something_with_it(T*&& ptr) 
    { 
//here I can do something with this ptr 
    } 

    template<class T,class... Args> 
    void do_something_with_them(T*&& ptr, Args&&... args) 
    { 
     do_something_with_it(std::forward<T&&>(ptr)); 
     do_something_with_them(std::forward<Args&&>(args)...); 
    } 

을하지만 어떤 이유로 나는 그 인수를 전달할 수 없습니다. 그것을 할 수있는 방법이 있습니까?
gcc 4.6.1을 사용하고 있습니다.

+0

내가 물어볼 수있는 완벽한 포인터 전달 기능은 무엇입니까? – fredoverflow

+0

#FredOverflow 완벽한 전달 포인터 아마도 포인터의 완벽한 전달 매개 변수 팩은 아무것도 아니지만 그렇지 않습니다. 그런데, 나는 단지이 물건을 배우려고 노력하고 있습니다. 그래서 나는 모든 의견을 듣는 것보다 행복합니다. 감사. – smallB

답변

2

T*&&이 아니기 때문에 컴파일 시간 오류가 발생할 가능성이 있습니다.은 완벽한 전달 차량입니다. T&& 만 있습니다. 따라서 ptr 매개 변수 의 직위 만 허용합니다. 그리고 그 외에도 std::forward<T&&>std::forward<T*>이어야합니다.하지만 이제는 어차피 다른 오류가 발생합니다. 이는 부적절합니다. 그리고 args이 비어있는 경우 때문에, do_something_with_them 0 인 매개 변수의 기본 케이스를 칠 do_something_with_them 미스에 대한 호출을뿐만 아니라 ... 당신이 정말 만에 포인터를 허용하려면

, 당신은 enable_if과 작업 할 수 있습니다 is_same 또는 is_convertible. 그러나 당연히 나는 그것이 "포워딩"이라고 생각하지 않습니다. 당신이 do_something_with_it 그것은 (인수를 허용할지 여부를 결정하게

template<typename T, typename ...Args> 
auto do_something_with_them(T&&t, Args&&...args) 
    -> decltype(do_something_with_it(std::forward<T>(t))) 
{ ... } 

그 방법

에 대해 어떻게 당신이 너무 그 decltype에 재귀 호출을 넣을 수 있습니다 원하는 경우. 나뿐만 독자에게 연습으로두고 어떤 연산자 여기에 필요할 수도 있습니다). 물론 do_something_with_it도 일반적인 문제가 아닙니다.