假设我有一个从字符串到字符串的函数,例如:
string identity(string text) {
return text;
}
如何打印应用于输入到输出的功能,避免显式变量,输入和输出处理?类似于Haskell中的interact
。
int main() {
std::interact(identity);
}
这样可以减少明显的代码,让algoritmh和逻辑突然出现。
示例用法是:
$./enhanced_cat
Example
Example
$
答案 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
而不是返回它。我个人喜欢这种区别:创造和执行是不同的事情。
此版本从输入流中读取所有内容,直至结束。阅读不到那么容易,只需替换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。