在C#中,有一个方便的特性,当想要显式忽略操作的结果时,可以使用下划线_作为丢弃变量.

我目前正在寻找C++中的一个等效功能或解决方法,它允许我在从一个函数检索多个值时丢弃特定值或节省内存分配.

Example:

假设我有一个如下所示的函数:

void readValues(float& temperature, float& humidity, float& dewpoint, float& tempTrend, float& humTrend) {
    // Some operation to retrieve values
}

如果我只需要知道温度,而我没有特定于温度的函数,我如何才能以最节省内存的方式丢弃其他值?

或者在Arduino/ESP32环境中忽略函数的某些返回值时,可以帮助节省内存空间的任何其他方法?

What I'm doing now:

float temperature;
float discard;

readValues(temperature, discard, discard, discard, discard);

What I tried:

float temperature;
readValeus(temperature, null_ptr, null_ptr, null_ptr, null_ptr);
float temperature;
readValues(temperature, 0, 0, 0, 0);

感谢您的任何见解或建议!

推荐答案

有几种方法可以做你想做的事情. 不过,没有直接等同于关键字discard的东西.

首先,在这种情况下,我不会担心内存效率. 即使您总是返回所有值,未使用的值及其创建也可能被优化.

此外,输出参数在C++中通常是不受欢迎的.(见F.20: For “out” output values, prefer return values to output parameters)你可以把东西打包成struct,然后简单地使用你感兴趣的部分.无论如何,这里有一些可能的解决方案:

(1)函数重载

void readValues(float& temperature, float& humidity, float& dewpoint);
void readValues(float& temperature, float& humidity);

第二个重载使dewpoint实际上成为可选参数.

(2)指针和默认参数

void readValues(float& temperature, float& humidity, float* dewpoint = nullptr);
// ...
readValues(t, h);     // don't provide dewpoint
readValues(t, h, &d); // provide dewpoint

(3)避免输出参数

这是我个人的最爱.

struct Weather {
    float temperature;
    float humidity;
    float dewpoint;
};

Weather readValues();

// ...
Weather w = readValues();
auto [t, h, d] = readValues();
auto [t, h, _] = readValues();

(4) [[maybe_unused]]

void readValues(float& temperature, float& humidity, float& dewpoint);
// ...

float t, h;
[[maybe_unused]] float _;
readValues(t, h, _);

您仍然需要提供一个额外的参数,但[[maybe_unused]]清楚地表达了意图,并取消了有关未使用变量的警告(如果有).

Csharp相关问答推荐

MongoDB实体框架核心:表达必须可写

如何禁用ASP.NET MVP按钮,以便无法使用开发人员控制台重新启用它

. NET 8 HttpClient post参数将其情况更改为camel'

. NET 8使用COM向VB6公开

通过EFCore上传大量数据.

安装附加的. exe与Visual Studio

Razor视图Razor页面指向同一端点时的优先级

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

C#普罗米修斯指标

.NET 8 DI GetServices<;对象&>不工作

在使用StringBuilder时,如何根据 colored颜色 设置为richTextBox中的特定行着色?

单元测试类型为HttpClient with Microsoft.Extensions.Http.Resilience

在扩展方法中,IEnumerable<;T>;不会转换为IEumerable<;T&>

WPF动态设置弹出窗口水平偏移

如何从Entity Framework Core中填充ListIInterface

两个DateTimeOffset之间的差异返回意外的负值

忽略Visual Studio代码中的StyleCop规则

无法创建&Quot;&Quot;类型的实例,因为无法将一个或多个参数绑定到

如何在C#中用Serilog记录类路径、方法名和行编号

能否将我图表中的星号与X轴上一天中的第二位数字对齐?