2011-07-31 2 views
2

아래에서 볼 수있는 함수 템플릿을 만들고 싶었습니다. 그들의 목적은 펑터를 비교하는 것이지만 boost.bind 유형의 펑터에 대해서는 특별한 경우를 다루어야했습니다.템플릿 과부하 (인수 개수 비교)

template<typename R, typename F, typename L> 
void compare(boost::_bi::bind_t<R, F, L>& lhs, boost::_bi::bind_t<R, F, L>& rhs) 
{ 
    std::cout << lhs.compare(rhs) << std::endl; 
} 

template<typename T> 
void compare(T lhs, T rhs) 
{ 
    std::cout << (lhs == rhs) << std::endl; 
} 

문제는 내가 compare(boost::bind(func, 1), boost::bind(func, 1)) 일 때 컴파일러가 두 번째 템플릿을 사용하려고한다는 것입니다. 두 번째 것을 주석 처리하면 boost.bind 유형에 특화된 것을 올바르게 사용할 것이고 모든 것이 잘 동작 할 것입니다.

올바른 기능 템플릿을 선택하려면 어떻게해야합니까?

+1

부스트 구현 개인 유형 인 유형에 의존하는 것처럼 보입니다. 당신은 당신이 통과하고있는 것에 정확히 맞는 타입을 가지고 있습니까? 첫 번째 템플리트를 사용하는 데 필요한 암시 적 변환이 있으면 두 번째 템플리트가 기본 유형으로 인스턴스화 될 수 있으므로 더 적합합니다. –

+0

필자는 먼저 int i = boost :: bind (func, 1)'을 사용하여 컴파일러에서 바인드가 반환되는 것을 알려주었습니다. 게다가, [function_equal templates] (http://www.boost.org/doc/libs/1_47_0/boost/bind/bind.hpp) 또한 bind_t를 인수로 사용하기 때문에 그렇게하는 것이 안전해야합니다. . –

+2

그냥'boost :: bind'를 쳐다 보았고 값으로 매개 변수를 반환 했으므로'boost :: find (func, 1), boost :: bind (func, 1))'와 같이 첫 번째 템플릿을 다음과 같이 사용하면 안됩니다. 임시가 아닌 참조에 바인딩 할 수 없습니다. 처음에'const'를 추가하면 OK입니다. 좀 더 일반적인 템플릿을 주석 처리하면 왜 작동하는지에 관해서는 잘 모르겠습니다. 내 구현에 일반 템플릿을 인스턴스화 할 때 오류가 발생합니다. –

답변

1

boost::bindconst 참조에 바인딩 할 수없는 값을 반환합니다. 당신의 더 전문화 된 템플릿은 값으로 인수를 취하거나 const으로 참조해야합니다. 그렇지 않으면 호출시 고려되지 않습니다 : compare(boost::bind(func, 1), boost::bind(func, 1)).

이 테스트 프로그램은 내 플랫폼에서 올바르게 컴파일되고 작동합니다.

#include <boost/bind/bind.hpp> 
#include <iostream> 
#include <ostream> 

template<typename R, typename F, typename L> 
void compare(const boost::_bi::bind_t<R, F, L>& lhs 
       , const boost::_bi::bind_t<R, F, L>& rhs) 
{ 
    std::cout << lhs.compare(rhs) << std::endl; 
} 

template<typename T> 
void compare(T lhs, T rhs) 
{ 
    std::cout << (lhs == rhs) << std::endl; 
} 

void func(int) {} 

int main() 
{ 
    compare(boost::bind(func, 1), boost::bind(func, 1)); 
}