Здравствуйте, Ароан, Вы писали:

PC>>Нет нельзя. Т.к. ты уже используешь буст вместо написания велосипеда можешь использовать http://www.boost.org/boost/lambda/construct.hpp (в хэдере ничего лишнего из boost.lambda).


А>Следующий код выдает ошибку 'result_type' : is not a member of 'boost::lambda::constructor<T>':


А>void main()
А>{
А>    char *b = "test";
А>    char* e = b + sizeof(b);
А>    string x = bind(constructor<string>(),_1,_2)(b,e);
А>    cout << x << endl;
А>}

А>Что я сделал не так?

1.
Вместо
char *b = "test";
char *e = b + sizeof(b);

надо
char b[] = "test";
char *e  = b + sizeof(b);


2. int main()

3. Открываем http://www.boost.org/libs/bind/bind.html#with_function_objects и видим, что для объектов надо явно
указывать возвращаемый тип:
std::string x = boost::bind<std::string>(lambda::constructor<std::string>(),_1,_2)(b,e);

или на старых компиляторах так:
std::string x = boost::bind(boost::type<std::string>, lambda::constructor<std::string>(),_1,_2)(b,e);


4. Чуть ниже там написано — эту операцию можно не производить, если есть result_type. Но его почему-то нет
в lambda::constructor<T>. Это определенно баг, и я обязательно извещу разработчиков буста об этом. А пока в этот шаблон
класса можно добавить строку typedef T result_type; тогда можно будет писать так:
std::string x = boost::bind(lambda::constructor<std::string>(),_1,_2)(b,e);

как ты и хотел.
В результате код станет таким:
#include <boost/bind.hpp>
#include <boost/lambda/construct.hpp>
#include <string>

int main()
{
    using namespace boost;
    char b[] = "test324324";
    char* e = b + sizeof(b);
    std::string x = boost::bind(lambda::constructor<std::string>(),_1,_2)(b,e);
    std::cout << x << std::endl;
}


P.S. В исходном варианте код работал правильно лишь для строк длиной 4 (на Win-платформе).
т.к. sizeof(T *) == 4.
Автор: Pavel Chikulaev    Оценить