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?
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
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
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. –