5

Tôi đang cố tạo vị từ cho std::find_if bằng cách sử dụng boost::bind cùng với boost::contains (từ thư viện tăng/algoritm/chuỗi). Đoạn mã sau hiển thị hai cách tôi đang cố gắng thực hiện điều này.Làm thế nào để ép buộc quá tải hàm mẫu cho tăng :: liên kết?

#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; 
} 

Khi biên dịch mã này bằng g ++ 3.4.5 Tôi nhận được kết quả sau.

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)' 

Khi tôi chuyển sang boost::icontains chỉ có một quá tải hoạt động tốt. Tôi biết cách giải quyết tình huống tương tự khi có nhiều tình trạng quá tải của chức năng không phải mẫu. Ai đó có thể giúp tôi viết chính xác không? Hay tôi nên viết hàm so sánh của riêng mình?

Trả lời

8

Bạn cần viết static_cast<bool(*)(const std::string&, const std::string&)>(&boost::contains<..>) để giải quyết tình trạng quá tải.

Vâng, đây là nỗi đau của hoàng gia với các mẫu và quá tải. Libs được viết với OOP và quá tải trong tâm trí rất khó sử dụng với các mẫu và tăng :: bind.

Tất cả chúng ta chờ biểu thức lambda C++ 0x, nên giải quyết mọi thứ tốt hơn.

+0

Chỉnh sửa nhỏ (ít nhất là trong g ++ 3.4.5) static_cast (tăng :: chứa <..>). Bây giờ nó hoạt động hoàn hảo. Cảm ơn rất nhiều cho gợi ý nhanh chóng. – lollinus

+0

Ok. Cảm ơn. Tôi đã cập nhật câu trả lời với điều đó. Tôi đã thường sử dụng điều này với ptrs thành viên chức năng vì vậy cú pháp func-ptr thường xuyên của tôi là một chút gỉ, rõ ràng. ;) – Macke

+0

Sự thẳng thắn của bạn về bản chất của các mẫu và quá tải PITA rất đáng tin cậy. Trước khi nhìn thấy điều đó, tôi nghĩ tôi phải làm điều gì đó sai. –

0

Mã đó có vẻ tốt (đúng + tuân thủ) với tôi và nó biên dịch bằng Visual Studio 2008 (đã tắt tiện ích mở rộng ngôn ngữ của Microsoft).

Hãy thử sử dụng phiên bản cập nhật mới nhất của gcc.

+0

Vấn đề là trong mã sản xuất của tôi, tôi không thể sử dụng trình biên dịch khác. – lollinus

+1

Trong trường hợp này, hãy dựa ít vào ma thuật mẫu: viết hàm bao hàm chỉ sử dụng mã tăng và chuyển hàm bao hàm làm đối số cho 'find_if'. – gimpf

+0

Tôi hiểu hoàn toàn rằng tôi có thể viết functor/wrapper của riêng tôi để làm khớp. Tôi chỉ muốn tìm hiểu những gì tôi đang thiếu trong lý do của tôi trong khi viết mã này. Ngoài ra tôi đồng ý rằng khả năng đọc mã bị ảnh hưởng khi viết như trong giải pháp được chấp nhận. – lollinus

Các vấn đề liên quan