思路
我尽量完全避免在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
的原型应该如下所示:
std::string slurp(std::istream&);
也就是说,参数i是非const
的,因此我无法将其绑定到临时变量。使用另一个变量似乎也没有解决这个问题的方法。
笨拙的解决方法
目前,我使用以下解决方案:
std::string input;
if (use_stdin)
input = slurp(std::cin);
else {
std::ifstream in(argv[1]);
input = slurp(in);
}
但是这让我感到不舒服。首先,它需要更多的代码(以源代码行数计算),但它也使用了一个 if
而不是(在这里)更合适的条件表达式,并且在声明后进行了赋值,而我想避免这种方式。
有没有一种好的方法来避免这种间接初始化的风格? 这个问题可能可以概括为所有需要改变临时对象的情况。在某种程度上,流难道不是为处理这些情况而设计的吗(一个const
流是没有意义的,但在临时流上操作确实是有意义的)?
static_cast
? - n. m.?:
。:
两侧必须是相同的类型。 - David Schwartzstd::cin
管用吗? - Mike Seymour