figured it out (enjoy the macro+template voodoo).
#include <boost/iterator/transform_iterator.hpp>
#include <boost/range/irange.hpp>
#include <boost/typeof/std/utility.hpp>
#include <iomanip>
#include <algorithm>
#include <functional>
#include <sstream>
std::string convertArgs(int arg1, int arg2){
std::stringstream out;
out << std::setfill('0') << std::setw(8) << arg1*arg2;
return out.str();
}
void boostTest(){
int first = 0, last = 42;
int arg = 2;
std::string desiredValue = "00000007";
BOOST_AUTO(range, boost::irange(first, last));
BOOST_AUTO(start, boost::make_transform_iterator(range.begin(), std::bind1st(std::ptr_fun(convertArgs), arg)));
BOOST_AUTO(end, boost::make_transform_iterator(range.end(), std::bind1st(std::ptr_fun(convertArgs), arg)));
BOOST_AUTO(found, std::lower_bound(start, end, desiredValue));
if (found != end){
std::cout << "str:" << *found << "\nval: " << *(found.base());
}
}
int main(int argc, char** argv){
boostTest();
return 0;
}
Most likely, can't be done easily without boost unless you generate arrays with all possible values, make wrapper iterators yourself or something like that.