【问题标题】:In whats case should use auto type?在什么情况下应该使用自动类型?
【发布时间】:2015-04-29 20:43:48
【问题描述】:

我有一些关于何时使用auto的问题

  1. 明确,尽管有上下文,这不是更清楚吗?
  2. 最好是明确的而不是auto的案例?

而 lambda 函数如何使用 auto 这些

auto f = [](auto v, auto x) {};
//or
std::function<void(auto v, auto x)> f;

谢谢...

【问题讨论】:

  • 您提供的两行代码做了两件非常不同的事情。 Lambda 是一种情况,您实际上必须使用 auto,因为它们的类型只有编译器知道。 This 可能对你来说很有趣。
  • @MikeMB 我不知道。这两行都不能编译,所以他们做同样的事情。一行更接近编译? (仅缺少 2 个字符)。另一个包含从 C++14 开始对 auto 的基本误解。
  • @Yakk:你说得对,尤其是函数版本没有任何意义。但是 lambda 和 std::function 在它们代表的内容和存储方式上有着根本的不同。每个 lambda 都是一个具有自己类型的函数对象,并在堆上创建。 std::funcion 是包装器,例如可以包装不同的函数或函数对象,只要它们具有正确的接口即可。很可能我也误解了这个问题,因为我专注于何时将 auto 用于变量,而不是用于 lambda 的参数类型推导。
  • @mike lambdas 不使用免费存储/堆存储...并非没有帮助。
  • @Yakk:对不起,我的意思当然是“堆栈”为时已晚

标签: c++ lambda auto c++14 std-function


【解决方案1】:

就我个人而言,我倾向于将auto 用于选定的几类代码:

  1. 无法表达的类型,例如由 lambdas 创建的类型:

    auto f = []() { /* some code */ };
    
  2. 迭代器,因为它们都实现了相同的不透明接口。我不在乎它是什么特定类型的迭代器,只是它的行为就像一个。

    auto it = m.find(key);
    if(it != m.end() {
        /* some code */
    }
    
  3. 如果类型已经在同一行中说明,例如强制转换:

    float f = 123.456;
    /* some code */
    auto n = static_cast<int>(f);
    

    或类似:

    if(auto p = dynamic_cast<Derived *>(base_ptr)) {
        /* some code here */
    }
    

对于其他一切,我会倾向于明确。

关于std::functionauto,我会尽可能使用auto,然后根据需要使用std::function。这是因为std::function 使用类型擦除技术实现了少量开销。

这通常意味着我将使用模板来实现在合理的情况下接受“可调用事物”的函数。

话虽如此,如果我需要存储一个函数,可以传递它,那么std::function 非常适合。

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2012-12-18
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多