【问题标题】:How to make lambda for this function?如何为这个函数制作 lambda?
【发布时间】:2021-11-13 23:55:16
【问题描述】:

我想知道如何在 C++ 中为这个函数创建一个 lambda,并且类型必须是 void

void setIO(string s){
   freopen((s+".in").c_str(),"r",stdin);
   freopen((s+".out").c_str(),"w",stdout);
}

【问题讨论】:

  • 这样做有什么意义?
  • 类似的事情在所谓的“竞赛”或“在线评委”网站及其示例中似乎很常见。在函数、lambda 或内联中,任何地方几乎都不需要这样的东西。如果您使用此类网站来学习任何东西,那么您应该考虑到此类网站不是任何类型的学习或教学资源,因此使用它们可能会对学习编程产生积极的危害。
  • 话虽如此,这个问题是XY problem。为什么需要使用这样的功能?为什么你需要把它变成一个lambda?您需要解决的实际和潜在问题是什么?
  • @Someprogrammerdude 那些网站,当用户花时间开发算法知识时,会努力优化他的代码风格(通过不创建低质量代码只是为了传递或使其紧凑),并阅读替代提交对于程序员来说非常有用。谷歌的面试基本上只有这些问题是有原因的。此外,当有人为了以逻辑方式了解一切而学习编程语言的角落时,这是一个很好的迹象。我不敢相信你在暗示理解语言设计中的边缘情况是没有用的。
  • @user904963 我并没有说这样的网站对那些已经了解编程和一些语言的人来说毫无用处。然而,它们对初学者有害。

标签: c++ lambda g++


【解决方案1】:

你可以像这样指定类型:

#include <iostream>
#include <fstream>

using namespace std;

int main() {
    const string FILE_NAME = "test.txt";
    
    auto f = [](string const &name) -> void {
        ofstream file;
        file.open(name);
        file << "junk\n" << "junk2" << endl;;
        file.close();
    };
    
    f(FILE_NAME);
    
    ifstream inputFile(FILE_NAME);
    if (inputFile.is_open()) {
        cout << "File is open." << endl;
        string line;
        while (getline(inputFile, line))
            cout << line << '\n';
        cout << flush;
        inputFile.close();
    } else
        cerr << "Error opening file." << endl;
    
    return EXIT_SUCCESS;
}

但是,lambda 函数可以推断返回类型,因此您可以省略 -&gt; void

auto f = [](string const &name) {
        ofstream file;
        file.open(name);
        file << "junk\n" << "junk2" << endl;;
        file.close();
    };

【讨论】:

    【解决方案2】:

    创建 lambda 的等效方法是:

    auto f = [](string s) -> void { 
            //freopen((s+".in").c_str(),"r",stdin);
            //freopen((s+".out").c_str(),"w",stdout);
            std::cout<<"inside lambda"<<std::endl;
            
            //some other code here
            
        };
    

    现在您可以使用/调用它:

    f("passing some string");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-09
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多