1

我正在努力找出为什么我无法使用模板类进行转换。

这是模板类的简化版本:

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 结果

4

2 回答 2

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.

于 2009-11-27T17:30:49.550 回答
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 ));
于 2009-11-27T17:34:54.317 回答