Como usar std :: transformar com modelos
-
05-07-2019 - |
Pergunta
Eu estou lutando para descobrir por que eu não consigo transformar a trabalhar com uma classe de modelo.
Aqui está uma versão simplificada da classe de modelo:
template<typename T>
class base
{
public :
base() : all_() {}
~base() {}
public:
bool add(T t)
{
typename vector<T>::iterator itr
= lower_bound(all_.begin(), all_.end(), t);
if ( itr == all_.end() || *itr != t )
{
all_.push_back(t);
cout << "ok" << endl;
return true;
}
cout << "failed" << endl;
return false;
}
static bool addTo(base<T> *c, T t)
{
return c->add(t);
}
private :
vector<T> all_;
};
E é aí que eu estou tentando usar transformar para capturar toda a saída bool da função de membro do add:
main()
{
base<int> test;
vector<bool> results;
vector<int> toAdd;
toAdd.push_back(10);
toAdd.push_back(11);
toAdd.push_back(10);
transform( toAdd.begin(), toAdd.end(),
back_inserter(results),
bind1st( (bool(*)(base<int>*,int))base<int>::addTo, &test ) );
}
O objectivo é o de inserir cada membro do recipiente TOADD usando qualquer base de :: suplemento ou base :: addTo, e capturar os resultados bool no vector resulta ??p>
Solução
Tente:
transform( toAdd.begin(), toAdd.end(),
back_inserter(results),
bind1st( mem_fun(&base<int>::add), &test ) );
O problema não é o modelo, é que bind1st conta com o apoio extra para o trabalho (ver http://www.sgi.com/tech/stl/AdaptableBinaryFunction.html ). AFAIK não pode nunca funcionar em planície ponteiros de função de idade.
boost::bind
pode fazer mais coisas, se você quiser trazer isso em Para esta situação que você não precisa dele, no entanto:. mem_fun
transforma uma função membro não-estático em uma função binária adaptável. addTo
, portanto, não é necessária qualquer um, mas se você fez necessidade de usar uma função membro estático em uma situação semelhante, então não há ptr_fun
.
Outras dicas
Adicione o seguinte à sua classe base:
typedef base<T>* first_argument_type;
typedef T second_argument_type;
typedef bool result_type;
bool operator () (base<T> *c, T t) const {
return c->add(t);
}
e mudança transformar a:
transform(toAdd.begin(), toAdd.end(),
back_inserter(results), bind1st(base<int>(), &test ));