我正在努力找出为什么我无法使用模板类进行转换。
以下是模板类的简化版本:
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_;
};
这就是我尝试使用transform来捕获add成员函数的所有bool输出的地方:
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 ) );
}
目的是使用base :: add或base :: addTo插入toAdd容器的每个成员,并在向量结果中捕获bool结果
答案 0 :(得分:6)
尝试:
transform( toAdd.begin(), toAdd.end(),
back_inserter(results),
bind1st( mem_fun(&base<int>::add), &test ) );
问题不在于模板,而是bind1st依赖额外的工作支持(参见http://www.sgi.com/tech/stl/AdaptableBinaryFunction.html)。 AFAIK它无法在普通的旧函数指针上运行。
boost::bind
可以做更多的事情,如果你想把它带进来。对于这种情况你不需要它,但是:mem_fun
将非静态成员函数转换为自适应二进制函数。因此也不需要addTo
,但如果您确实需要在类似情况下使用静态成员函数,那么ptr_fun
。
答案 1 :(得分:0)
将以下内容添加到基类:
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);
}
并将转换更改为:
transform(toAdd.begin(), toAdd.end(),
back_inserter(results), bind1st(base<int>(), &test ));