Это то, что вы имеете в виду:
template <typename T, typename arg>
void ElementNode::IterateAttributes(boost::function<T (arg, Attribute)> func_, arg a)
{
std::vector<Attribute>::iterator it = v_attributes.begin();
for (; it != v_attributes.end(); it++)
{
func_(a, *it);
}
}
, который допускает только один параметр любого типа - если вы хотите, вы можете ввести также версию для большего количества параметров.
О возвращаемом значении - чточто делать с этим, зависит от того, какое значение оно имеет на самом деле - общее (и, вероятно, ненужное) решение будет возвращать std::list<T>
, но это создаст больше проблем, чем решит, я полагаю.Если тип возвращаемого значения изменяется (не только по типу, но и по значению), я предлагаю изменить шаблонную функцию, чтобы она брала ссылку / указатель на общий результат и обновляла его соответствующим образом:
template <typename T> template <typename arg>
void ElementNode::IterateAttributes(boost::function<voidT (arg, Attribute, T&)> func_)
{
std::vector<Attribute>::iterator it = v_attributes.begin();
T result;
for (; it != v_attributes.end(); it++)
{
func_(arg, *it, result);
}
return result;
}
Это быстрый обходной путь, он работаетно это уродливо, подвержено ошибкам и мучительно для отладки.
Если вам нужно переменное количество параметров, вам нужно будет создать несколько шаблонов вышеуказанной функции - я только что проверил, если это возможно:
template <typename T>
T boo(T){
}
template <typename T, typename TT>
TT boo(T,TT){
}
void test()
{
int i;
i= boo<int>(0);
i=boo<int,double>(0,0.0);
}
Вы должны помнить, что функции, передаваемые в IterateAttributes, должны точно соответствовать параметрам, переданным функции Iterate.Это также означает, что вы не можете использовать в его прототипе значения по умолчанию - возможно, вам придется определить несколько перегруженных версий, таких как
void func_(Attribute,arg1, arg2,arg3){...}
void func_(Attribute A,arg1 a1,arg2 a2){func_(A,a1, a2,default3);}
void func_(Attribute A,arg1 a1){func_(A,a1, default2,default3);}
void func_(Attribute A){func_(A,default1, default2,default3);}