有没有办法在 C++ 中将 auto 作为参数传递?

Posted

技术标签:

【中文标题】有没有办法在 C++ 中将 auto 作为参数传递?【英文标题】:Is there a way to pass auto as an argument in C++? 【发布时间】: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 这听起来像字符串输入,希望最好(实际上,你总是会被欺骗)。我也更喜欢较长的形式,因为它对模板更明确;也许有一天我会改变,但只有在有了概念之后! 【参考方案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 )

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

    表单的占位符类型说明符 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 概念,这将成为标准功能

以上是关于有没有办法在 C++ 中将 auto 作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中将类作为参数传递?

在 C++ (Arduino) 中将带有参数的函数作为参数传递

在 pssh 中将密码作为参数传递

在 C++ 中将不同大小的常量数组作为函数参数传递

在 Groovy 中将方法作为参数传递

我们如何在 C++ 中将二维数组/向量作为函数参数传递? [复制]