C ++增强型猫

时间:2015-08-14 18:05:00

标签: c++ string input user-input

假设我有一个从字符串到字符串的函数,例如:

string identity(string text) {
    return text;
}

如何打印应用于输入到输出的功能,避免显式变量,输入和输出处理?类似于Haskell中的interact

int main() {
    std::interact(identity);
}

这样可以减少明显的代码,让algoritmh和逻辑突然出现。

示例用法是:

$./enhanced_cat
Example
Example
$

3 个答案:

答案 0 :(得分:1)

template<class F>
struct interacter_t {
  F f;
  void operator()( std::istream& is = std::cin, std::ostream& os = std::cout ) {
    std::string in;
    while( getline( is, in ) ) {
      os << f(std::move(in)) << '\n';
    }
  }
};
template<class F>
interacter_t<std::decay_t<F>> interact( F&& f ) {
  return {std::forward<F>(f)};
}

然后:

int main() {
  auto io = interact(identity);
  std::cout << "Start:\n";
  io();
  std::cout << "End.\n";
}

我添加了单独的调用来创建交互器对象。

你可以在一行上完成:

  std::cout << "Start:\n";
  interact(identity)();
  std::cout << "End.\n";

或者您可以修改interact以运行interactor_t而不是返回它。我个人喜欢这种区别:创造和执行是不同的事情。

live example

此版本从输入流中读取所有内容,直至结束。阅读不到那么容易,只需替换operator()的正文。

答案 1 :(得分:1)

您可以滚动自己的互动,如下所示。 (注意:可能实际上不会按原样编译。)

void interact(string (*function)(string))
{
    string input;
    getline(cin, input);
    cout << function(input) << endl;
}

答案 2 :(得分:1)

您可以使用std::function轻松自行编写此类内容。例如:

#include <string>
#include <iostream>
#include <functional>

std::string identity(std::string const& text) {
    return text;
}

void interact(std::function<std::string(std::string const&)> f)
{
    std::string input;
    std::getline(std::cin, input);
    std::cout << f(input);
}

int main()
{
    interact(identity);
}

但这肯定不像惯用的C ++。尽管C ++在某种程度上支持函数式编程,但它不是函数式编程语言,你不应该尝试用C ++编写Haskell。