5

std::find_if에 대한 조건자를 boost::contains (boost/algoritm/string 라이브러리의)과 함께 boost::bind을 사용하여 작성하려고합니다. 다음 발췌 문장은이 작업을 수행하는 방법 두 가지를 보여줍니다. boost :: bind에 템플릿 함수 오버로드를 강제하는 방법?

#include <boost/algorithm/string.hpp> 
#include <boost/bind.hpp> 
#include <boost/function.hpp> 

#include <iostream> 
#include <string> 

int main(int argc, char** argv) { 
     std::string s1("hello mom"); 
     std::string s2("bye mom"); 

     boost::function<bool (std::string, std::string)> f = &boost::contains<std::string, std::string>; 
     std::cout << s1 << " contains " << "hello, " << std::boolalpha << f(s1, "hello") << std::endl; 
     std::cout << s2 << " contains " << "hello, " << std::boolalpha << f(s2, "hello") << std::endl; 

     boost::function<bool (std::string)> contain_hello = boost::bind(boost::contains<std::string, std::string>, _1, std::string("hello")); 
     std::cout << s1 << " contains " << "hello, " << std::boolalpha << contain_hello(s1) << std::endl; 
     std::cout << s2 << " contains " << "hello, " << std::boolalpha << contain_hello(s2) << std::endl; 
     return EXIT_SUCCESS; 
} 

I 출력 다음 받고 있어요 3.4.5 ++ g이 코드를 컴파일.

error: conversion from `<unresolved overloaded function type>' to non-scalar type `boost::function<bool()(std::string, std::string), std::allocator<void> >' requested 
error: no matching function for call to `bind(<unresolved overloaded function type>, boost::arg<1>&, std::string)' 

내가 잘 작동 everyting 하나의 과부하를 가지고 boost::icontains로 전환합니다. 템플릿이 아닌 함수가 여러 번 오버로드되는 경우 비슷한 상황을 해결하는 방법을 알고 있습니다. 누군가가 이것을 올바르게 쓸 수있게 도와 줄 수 있습니까? 아니면 내 자신의 비교 함수를 작성해야합니까?

답변

8

과부하를 해결하려면 static_cast<bool(*)(const std::string&, const std::string&)>(&boost::contains<..>)을 작성해야합니다.

예, 이것은 템플릿과 과부하로 인한 고통입니다. OOP로 작성되고 과부하를 염두에 둔 라이브러리는 템플릿과 boost :: bind에서 사용하기가 어렵습니다.

우리 모두는 C++ 0x lambda 표현식을 기다립니다. 더 나은 것을 해결해야합니다.

+0

작은 교정 (적어도 g ++ 3.4.5 이상) static_cast (boost :: contains <..>). 이제 완벽하게 작동합니다. 빠른 힌트를 주셔서 감사합니다. – lollinus

+0

감사. 그 대답을 업데이트했습니다. 필자는 멤버 함수 ptrs와 함께이 함수를 사용했기 때문에 일반적인 func-ptr 구문이 약간 녹슬 었습니다. ;) – Macke

+0

템플릿의 PITA 성격에 대한 솔직함과 과부하는 매우 안심입니다. 그것을보기 전에, 나는 틀린 일을하고 있었음에 틀림 없다고 생각했습니다. –

0

그 코드는 나에게 잘 맞고 (Visual Studio 2008을 사용하여 컴파일됩니다 (Microsoft 언어 확장을 사용하지 않음).

gcc의 최신 버전을 사용해보십시오.

+0

문제는 제 제작 코드에서 다른 컴파일러를 사용할 수 없다는 것입니다. – lollinus

+1

그런 경우 템플릿 매직에 덜 의존하십시오 : 부스트 코드 만 사용하는 래퍼 함수를 ​​작성하고 래퍼 함수를 ​​인수로 'find_if'에 전달하십시오. – gimpf

+0

필자는 매칭을 위해 필자 자신의 Functor/래퍼를 작성할 수 있음을 완벽하게 이해합니다. 이 코드를 작성하는 동안 내 추론에서 내가 누락 된 부분을 배우고 싶었습니다. 또한 허용 된 솔루션 에서처럼이 코드를 작성할 때 코드 가독성이 떨어지는 데 동의합니다. – lollinus