【问题标题】:Is there a way to pass auto as an argument in C++?有没有办法在 C++ 中将 auto 作为参数传递?
【发布时间】:2015-07-08 19:30:31
【问题描述】:

有没有办法将 auto 作为参数传递给另一个函数?

int function(auto data)
{
    //DOES something
}

【问题讨论】:

  • 取决于您期望它能够做什么。您需要什么功能模板不提供的功能?
  • 这是一个可怕的想法。参数类型不仅适合您,还可以让其他人知道您的函数想要什么类型。只需花 3 秒写类型,不要那么懒惰(如果类型不固定,则使用模板)。
  • 是的,使用 C++1z 概念,您可以做到这一点 :)
  • @Synxis 这并不总是一个可怕的想法。如果类型足够复杂,则将其替换为auto 可能更易读(假设变量名有意义)。另外,我认为void f(auto t);template<typename T> void f(T t); 更具可读性,假设Tf 中没有明确要求。
  • @pasbi assuming a meaningful variable name 这听起来像字符串输入,希望最好(实际上,你总是会被欺骗)。我也更喜欢较长的形式,因为它对模板更明确;也许有一天我会改变,但只有在有了概念之后!

标签: c++ function arguments auto


【解决方案1】:

如果您希望这意味着您可以将任何类型传递给函数,请将其设为模板:

template <typename T> int function(T data);

有一个 C++17 提议允许您使用您使用的语法(正如 C++14 已经对通用 lambda 所做的那样),但它还不是标准的。

编辑:C++ 2020 现在支持自动函数参数。请参阅下面的 Amir 的回答

【讨论】:

  • 我想知道:是不是一回事?也就是说,对于每个T,都会有一个function&lt;T&gt;,而对于auto,只有一个,因为它的扣除发生了变化。还是我错了?
  • @black:这只是写同一件事的一种更短的方式。将为auto 推导出的每个参数类型实例化不同的函数,就像命名模板参数一样。
  • 我认为隐式模板参数应该受到概念的约束......现在概念完全死了,还是 auto 用于不受约束的参数和(有一天)用于受约束的概念?
  • @BenVoigt:我不知道,我的超自然力量不足以知道 C++17 最终会是什么样子。概念当然没有死,而且很可能会以那个标准结束。但是否允许不受约束的auto 函数参数与它们有些正交。
  • @BenVoigt 是的,就是这个想法。 Concepts Lite 引入了auto 参数作为无约束参数的简写,并引入了受约束参数的概念。
【解决方案2】:

C++20 允许auto 作为函数参数类型

此代码使用 C++20 有效:

int function(auto data) {
   // do something, there is no constraint on data
}

作为abbreviated function template

这是非约束类型约束的特例(即无约束自动参数)。 使用概念,约束类型约束版本(即约束自动参数)将是例如:

void function(const Sortable auto& data) {
    // do something that requires data to be Sortable
    // assuming there is a concept named Sortable
}

规范中的措辞,在我朋友Yehezkel Bernat的帮助下:

9.2.8.5 占位符类型说明符 [dcl.spec.auto]

占位符类型说明符:

类型约束opt自动

类型约束opt decltype ( auto )

  1. 占位符类型说明符指定一个 占位符类型,稍后将通过从 初始化器。

  2. 表单的占位符类型说明符 type-constraintopt auto 可用于 a 的 decl-specifier-seq 函数声明或 lambda 表达式的参数声明 并表示该函数是一个缩写的函数模板 (9.3.3.5) ...

【讨论】:

    【解决方案3】:

    模板是您使用普通函数执行此操作的方式:

    template <typename T>
    int function(T data)
    {
        //DOES something
    }
    

    或者,您可以使用 lambda:

    auto function = [] (auto data) { /*DOES something*/ };
    

    【讨论】:

    • 通用 lambda 是 C++14 的一个特性。
    【解决方案4】:

    我不知道它是什么时候改变的,但目前来自 Question 的语法在 c++14 中是可能的:

    https://coliru.stacked-crooked.com/a/93ab03e88f745b6c

    只有警告:

    g++ -std=c++14 -Wall -pedantic -pthread main.cpp && ./a.out main.cpp:5:15:警告:在参数声明中使用“auto”仅适用于 -fconcepts 无效函数(自动数据)

    用c++11有错误:

    main.cpp:5:15: 错误:在参数声明中使用 'auto' 仅适用于 -std=c++14 或 -std=gnu++14

    【讨论】:

    • 如您所见,这是特定于 gcc 的扩展,它只能与 Concepts TS 一起使用。使用标准中的 C++20 概念,这将成为标准功能
    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 2010-11-11
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多