【问题标题】:function object that converts string to uppercase将字符串转换为大写的函数对象
【发布时间】:2017-11-01 10:34:56
【问题描述】:

我想创建一个函数对象,将字符串字母转换为大写,以便我可以将该函子传递给 transform() - transform(string.begin(), string.end(), string.begin(), stringToUp()); 。我知道我可以做其他事情,这只是一个练习。这是我的代码有效,但我的问题是为什么它可以工作,因为我将stringToUp 传递给transform 而没有任何参数?

class stringToUp{

public:

    int operator()(int ex) {
        return toupper(ex);  // ?? 
    }
};

int main(){

string k("toupper");

    transform(k.begin(), k.end(), k.begin(), stringToUp());
}

【问题讨论】:

  • “为什么它可以工作,因为我将 stringToUp 传递给没有任何参数的转换?” std::transform 这样做,不是你。
  • std::transform() 调用您传递的对象的operator()。但是为什么不将std::toupper 传递给std::transform()
  • @Peter 正如我所说,这只是了解函子如何工作的练习

标签: c++ string functor uppercase


【解决方案1】:

stringToUp 是一个类。您可以拥有一个 stringToUp 的对象:

int main() {
    stringToUp toUp;
    return 0;
}

它有一个operator(),所以你可以像函数一样使用stringToUp类型的对象

int main() {
    stringToUp toUp;
    char x = toUp('x');
    return 0;
}

在编写模板时,函数和函数对象看起来是一样的:

template<typename Functor>
void transform(int& out, int in, Functor functor) {
   out = functor(in);
}

int main() {
    stringToUp toUp;
    char x, y;
    transform(x, 'x', toUp); // like "x = toUp('x');"
    transform(x, 'x', std::toupper); // like "y = std::toupper('y');"
    return 0;
}

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 2011-10-29
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2014-01-14
    相关资源
    最近更新 更多