2011-10-14 1 views
0

, 내가하는 기능이 있습니다. shared_ptr<> 같은 새로운 구현 이제 교체 템플릿 함수 foo (T *) (T)는 내 코드에서

template<typename T> 
void foo (T*); // make sure that 'foo()' is passed only pointers 

, 나는 또한 스마트 포인터를 전달하고 (뭔가를 그래서 나는

template<typename T> 
void foo (T); // pointers or smart-pointers 

코드는 잘 작동한다에 함수의 서명을 변경했습니다. 그러나, 나는 놓치고?

+1

템플릿 함수가 아닙니다 ... –

답변

0

무효 foo는 (T)를 통과하여 복사 어떤 부작용이있다.sizeof (T)가 작지 않으면3210 T & (참조로 전달)이 더 효율적입니다.

+1

... 'T'가 단지 포인터 인 경우에는 전혀 쓸모가 없습니다. 그리고 대부분의 스마트 포인터는 포인터 밖에서 방대한 양의 데이터를 보유하지 않습니다. (스마트 포인터 타입에 따라서는 아무것도 저장하지 않고, 여분의 모든 정보는 pointed-to 객체와 함께 저장 될 것입니다.) 그리고 이것을 수행하려면'const T &'를 사용하십시오. 그렇지 않으면 결국 몇 가지 흥미로운 부작용이 있습니다. –

1

원하는 경우 enable_if를 사용하여 shared_ptr의 포인터 또는 인스턴스 만 컴파일하도록 허용 할 수 있습니다. 그런 식으로 이전에 가지고 있던 컴파일 타임 검사를 되 찾을 수 있습니다. (아마도 함수 구현도 그렇게 할 것입니다).

+0

이 메커니즘은 알려지지 않은 유형의 스마트 포인터에 대해서는 실패합니다. 따라서 확장 성은 다소 제한적입니다. –

+0

is_pointer_type 형질을 만들지 않는다면 ... 젠장, 부스트에는 하나도 없다. 게으른 부스트 :-( – Ayjay