C ++编写的modify_if函数

时间:2009-10-06 18:20:19

标签: c++ visual-studio stl

我有一个问题,让我对我必须做的事感到困惑。问题如下:

  1. 我们的想法是设计一个名为Modify_If的通用函数,它将输入x(通过引用传递)和两个函子f1和f2。函数Modify_If将使用函子f1来确定x是否服从某个条件。如果是这样,Modify_if将通过将仿函数f2应用于它来更改x的值。
  2. Modify_If的原型如下:

    template <class C, class Tester, class Transform>
    void Modify_If(C & a, Tester f, Transform g)
    

    我必须编写Modify_If函数,但我不知道从哪里开始,所以如果有人可以帮助我,我会很感激。

4 个答案:

答案 0 :(得分:5)

template <class C, class Tester, class Transform>
void Modify_If(C& a, Tester f1, Transform f2) {
    if (f1(a)) // Apply f1 to a - Check whether result is true
        a = f2(a); // Transform with f2; save
}

答案 1 :(得分:1)

从描述中可以看出,如果g(a)返回true,那么你应该做的就是执行f(a)。这看起来像这样:

if(f(a)) {
  g(a);
}

答案 2 :(得分:1)

在两个仿函数TesterTransform中,您所要做的就是为每个仿函数创建一个类,并重载()运算符。然后将仿函数的主体写成函数。这是一个简单的仿函数骨架:

class Functor
{
public:
   template <class Type>
   void operator()(Type& value) // it doesn't have to be void.
   {
     // functor body, as if it were a function.
   }
};

然后,您可以将仿函数作为参数传递,方法是创建它的对象,或者通过动态创建它来轻松传递:

template <class Func>
void fun(Func f); // a function hat accepts a functor.
Functor f;
fun(f);
fun(Functor()); // creating the functor on the fly.

答案 3 :(得分:1)

函数原型可能如下所示:

template<class ForwardIterator, class Predicate, class Type>
void transform_if(
      ForwardIterator First, 
      ForwardIterator Last,
      Predicate Pred, 
      UnaryFunction Func
   );

在其实现中,您应该遍历所有元素集并将Func应用于将为Pred(*element_iterator)返回true的所有元素。