Qute от стандарта:
25.2.3 Transform [lib.alg.преобразование]
Требуется:
Операции op и binary_op не должны иметь побочных эффектов.
Side Effect (wikipedia definition)
В вашем случае мы имеем следующий побочный эффект:
Converter c(data);
c(some_const_value) != c(some_const_value);
У вас нет никаких гарантий относительно алгоритмов, но я верю, что он будет работать практически на всех реализаций СТЛ ,
Предложенное решение
Кажется, я знаю один способ сделать то, что вам нужно:
использовать повышение :: counting_iterator - для перебрать двух контейнеров;
это будет выглядеть так:
bool bit_enabled(size_t data, unsigned char number)
{
return (data & 1 << number) != 0;
}
std::string select_word(
const std::string& word,
size_t data,
size_t number)
{
return bit_enabled(data, number) ? word : std::string(' ', word.length());
}
const size_t data = 7;
const boost::array< std::string, 3 > vocabulary = { "a", "b", "c" };
std::vector<std::string> result;
std::transform(
vocabulary.begin(),
vocabulary.end(),
boost::counting_iterator<size_t>(0),
back_inserter(result),
boost::bind(&select_word, _1, data, _2)
);
Кроме того, может быть, если вы будете определять битовый итератор или будете использовать некоторый битовый контейнер вы можете использовать повышение :: zip_iterator для итерации оба контейнера.
РЕДАКТИРОВАТЬ:
за вчера я нашел interest article, которые содержат определение побочного эффекта в соответствии со стандартом.
Стандарт определяет побочный эффект, как следующим образом: Доступ к объекту назначенных летучим именующим, модифицирующего объект, вызывая библиотеку функцию ввод/вывода, или вызов функции , что делает любой из тех, операции все побочные эффекты, которые являются изменениями в состоянии исполнения окружающей среды.
EDIT:
Я надеюсь, что это будет последнее редактирование.
Я всегда утверждаю, что «нет побочного эффекта» означает:
f (a) должно быть равно f (a) всегда. (f зависит от среды исполнения: memory/cpu/global variables/member variables, как в вашем случае и т. д.).
«Не производить побочный эффект» означает - не меняйте среду исполнения.
Но в стандарте C++ у нас есть более низкий уровень отказа от побочного эффекта.
Что вы делаете в своем примере под названием Состояния Функтор.
Стандарт не говорит о функциях «Statefull», но также не говорит о количестве копий вашего функтора - вы не могли использовать этот трюк, потому что это неуказанное поведение.
список См стандартной библиотеки вопросы (аналогичный вопрос для predicat):
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#92
Фактически, примечание о побочном эффекте больше не появляется в текущей черновике. но вместо этого он говорит, что алгоритмы могут свободно копировать свои объекты функций, если не указано иное. поэтому я думаю, что «побочные эффекты» означают изменение членов функционального объекта. –