У меня был бы один вопрос: вам действительно нужно указать все эти аргументы?
struct XR
{
template <class Foo>
void operator()(Foo& foo) const { foo.r = 12 * foo.r; }
};
Это работает, нет необходимости в дополнительном make
методе, он просто работает:
void testforx()
{
std::vector<FF> cont(5);
std::for_each(cont.begin(), cont.end(), XR());
}
Я предпочитаю не быть СЛИШКОМ универсальным при создании шаблонов.
Если вам нужен более сложный operator()
, вы всегда можете сделать тяжелую работу ВНУТРИ.
Также вы можете рассмотреть Boost.Bind
, если вы действительно хотите извлечь функции указателя и ссылки на атрибуты.
EDIT
У меня есть идея, которая будет немного отличаться и не потребует никакой магии макросов или даже магии метапрограммирования.
Почему бы просто не использовать typedef и покончить с этим?
Ладно, может быть не так автоматизировано, как хотелось бы ... но вам нужно всего лишь набрать это один раз.
typedef X<int,FF,&FF::m> X_FF_m; // once
std::for_each(cont.begin(), cont.end(), X_FF_m() );
Кажется, меньше печатать, чем
std::for_each(cont.begin(), cont.end(), createX<&FF::m>());
повторяется снова и снова.
Я едва использую голые шаблоны в своем коде, я предпочитаю печатать их, чтобы улучшить читаемость.