2013-07-23 2 views
0

두 인터페이스가 동일한 기능을 갖고 싶습니다. 구현이 둘 다 동일하고 동일한 기능을 2 개의 오버로드 된 시그니처에 구현했기 때문에 실제로 원하는 것은 아닙니다. 기본적으로템플릿 T와 T & 같은 구현에서

#include <iostream> 
#include <vector> 

template <typename T> 
void foo(T&) {} // I have to write the same things here ... 

template <typename T> 
void foo(T) {} // ... and here 

int main() { 
    foo(std::vector<int>()); // call only for T 

    std::vector<int> v; 
    foo(v); // ambiguos call but I only need 1 implementation 

    return (0); 
} 

내가 주요 문제는 같은 구현을 유지하고 단지 서명을 과부하 또는 제거되기 때문에 단서가 없다 1.

에이 개 템플릿 기능을이 상황을 해결하고 융합 싶습니다 템플릿 사용.

+0

구현에 차이가 없다면 - 인수를 값으로 사용하는 오버로드를 제공하는 이유는 무엇입니까? – arne

+0

@arne은 – user2485710

+1

@ user2485710의 첫 번째 호출을 살펴 봅니다. rvalue-references를 사용하지 않는 이유는 무엇입니까? – ForEveR

답변

1

rvalues을 사용하지 않으시겠습니까? 그것이 _ r- 수치 참조 _ 또는

#include <iostream> 
#include <vector> 

template <typename T> 
void foo(T&&) {} 
//  ^^ 

int main() { 
    foo(std::vector<int>()); 

    std::vector<int> v; 
    foo(v); 

    return (0); 
} 

rvalues가 허용하는 것 _ 좌변 참조 _가 될 수있는 _ 보편적 기준 _이다 : interjay 말했듯

일반 객체뿐만 아니라 임시 객체에 대한 참조를가집니다.

r- 수치 (소위, 역사적으로, 대입 식의 우변에 나타나는 수 우변 때문에) 통상적 수명, 이들 임시 객체 또는 서브 객체의 끝 근처 목적 , 또는 객체와 관련되지 않은 값.

편집 :

또한 const T&을 사용할 수 있지만 그것은 당신이 객체 수정을 허용하지 않습니다 :

template <typename T> 
void foo(T&& v) 
{ 
    v.push_back(1); // good... 
} 

template <typename T> 
void foo2(const T& v) 
{ 
    v.push_back(1); // ILLEGAL... 
} 

난 당신이 '돈 경우 마지막으로 솔루션을 사용하도록 제안을 객체를 전혀 수정하지 않아도됩니다.

+0

모두 잡을 수있는 서명, http : // ideone.com/dFUcUB 네, 작동합니다. 나는 이것에 대해 완전히 잊어 버렸습니다 ... 감사합니다. – user2485710

+2

"rvalue"라는 용어는 다소 오해의 소지가 있습니다. 이것은 실제로 보편적 인 참조이며, rvalue 참조 또는 lvalue 참조 일 수 있습니다. – interjay

+0

@interjay 네, 맞습니다. 'rvalue'보다 보편적 인 참조입니다. –

관련 문제