2013-11-07 4 views
2

Каков наилучший способ использования метода из указателя в stl::generate? Пример:C++ Сгенерировать функцию с помощью указателя

std::vector<double> doSomethingToAVector(boost::shared_ptr<RandomGenerator> randomGen){ 
    std::vector<double> output(100); 
    std::generate(output.begin(), output.end(), randomGen->returnANumber()); 
    return output; 
} 

RandomGenerator просто некоторый произвольный класс с методом returnANumber(), который возвращает произвольный двойником.

Моего компилятор в настоящее время говорит

called object type 'double' is not a function or function pointer 
    *__first = __gen(); 

Должен ли я использовать mem_fun или другую такую ​​магию?

ответ

1

Вы можете использовать std::bind() для привязки неявного параметра объекта. Например:

std::generate(output.begin(), output.end(), 
       std::bind(&RandomGenerator::returnANumber, randomGen)); 

Я не знаю, если это работает, если randomGen является boost::shared_ptr<RandomGenerator>, но это, конечно, работать с std::shared_ptr<RandomGenerator>. Это предполагает текущий C++ (т. Е. Пересмотр с 2011 года). Я бы ожидал, что что-то подобное работает с Boost с использованием C++ 03.

+0

Hi. Да, кажется, мне нужно «привязать» его. Если это не так: 'std :: bind (& RandomGenerator :: returnANumber, randomGen, std :: placeholders :: _ 1)' Я не хочу использовать C++ 11, поскольку я ничего не знаю об этом еще и не может гарантировать, что у других это будет. Хм. – user2966558

+0

@ user2966558: 'std :: generate()' хочет использовать объект с нулевой функцией. Ваше выражение создаст унарную функцию, то есть алгоритм должен будет пройти, по крайней мере, один аргумент, но он не передает никаких аргументов функции генератора. Что касается C++ 11, я думаю, что Boost имеет аналогичный 'bind()', который также работает с типами указателей в качестве первого аргумента для функций-членов. –

+0

@ user2966558 Он [работает] (http://coliru.stacked-crooked.com/a/028215f13c7cee72) с 'boost :: bind' – Praetorian

Смежные вопросы