Как вызвать шаблонную перегрузку функции для повышения:: связать?

Я пытаюсь создать предикат для std::find_if при помощи boost::bind вместе с boost::contains (из boost/algoritm/string библиотеки). Следующий отрывок показывает два пути, как я пытаюсь выполнить это.

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

При компиляции этого кода с g ++ 3.4.5 я получаю следующий вывод.

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

Когда я переключаюсь на boost::icontains который имеет только одну перегрузку, все хорошо работает. Я знаю, как решить аналогичную ситуацию, когда существует несколько перегрузок нешаблонной функции. Кто-то может помочь мне записать это правильно? Или я должен записать, что мои собственные сравнивают функцию?

5
задан lollinus 24 February 2010 в 14:23
поделиться

2 ответа

Вам нужно написать static_cast (& boost :: contains <..>) для устранения перегрузки.

Да, это настоящая головная боль шаблонов и перегрузок. Библиотеки, написанные с учетом ООП и перегрузки, трудно использовать с шаблонами и boost :: bind.

Мы все ждем лямбда-выражений C ++ 0x, которые должны решить проблему лучше.

8
ответ дан 14 December 2019 в 04:36
поделиться

Этот код мне кажется прекрасным (правильный + совместимый), и он компилируется с использованием Visual Studio 2008 (с отключенными языковыми расширениями Microsoft).

Попробуйте использовать более свежую версию gcc.

0
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: