gpt4 book ai didi

c++ - 将临时绑定(bind)到非常量引用

转载 作者:IT老高 更新时间:2023-10-28 22:18:14 30 4
gpt4 key购买 nike

基本原理

我尽量避免在 C++ 代码中进行赋值完全。也就是说,我只使用初始化,并尽可能将局部变量声明为 const(即,总是除了循环变量或累加器)。

现在,我发现了一个不起作用的案例。我相信这是一种普遍模式,但特别是在以下情况下会出现:

问题描述

假设我有一个程序将输入文件的内容加载到字符串中。您可以通过提供文件名 (tool filename) 或使用标准输入流 (cat filename | tool) 来调用该工具。现在,如何初始化字符串?

以下操作无效:

bool const use_stdin = argc == 1;
std::string const input = slurp(use_stdin ? static_cast<std::istream&>(std::cin)
: std::ifstream(argv[1]));

为什么这不起作用?因为slurp的原型(prototype)需要如下:

std::string slurp(std::istream&);

也就是说,参数 i non-const 因此我无法将其绑定(bind)到临时变量。似乎也没有办法使用单独的变量来解决这个问题。

丑陋的解决方法

目前,我使用以下解决方案:

std::string input;
if (use_stdin)
input = slurp(std::cin);
else {
std::ifstream in(argv[1]);
input = slurp(in);
}

但这让我很不爽。首先,它有更多代码(在 SLOC 中),但它也使用 if 而不是(这里)更合乎逻辑的条件表达式,并且它在声明后使用我想避免的赋值。

有没有避免这种间接初始化风格的好方法?这个问题很可能会泛化到需要对临时对象进行变异的所有情况。流是不是设计得很糟糕以应对这种情况(const 流没有意义,但处理临时流确实有意义)?

最佳答案

为什么不简单地重载 slurp

std::string slurp(char const* filename) {
std::ifstream in(filename);
return slurp(in);
}

int main(int argc, char* argv[]) {
bool const use_stdin = argc == 1;
std::string const input = use_stdin ? slurp(std::cin) : slurp(argv[1]);
}

这是一个带有条件运算符的通用解决方案。

关于c++ - 将临时绑定(bind)到非常量引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111110/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com