我有一个现有std::ostream
的 -like 类型,它对operator<<
各种类型有几个重载。由于该类型用作const&
其他 API 的参数,因此我在调用站点添加了方便的工厂函数以便于内联使用。
我编写了下面的代码,它工作正常(VS2019 和 GCC9),但我想知道几件事:
- 我真的需要 1-arg 重载吗?拥有它有什么好处吗?
- 1-arg 重载使用 (Scott Meyers') 魔术引用,但可变参数重载应该使用它们吗?我试过
Ts...&&
了,但 VS2019 不喜欢这样。 - 在 Debug 中,我遵循 return 语句,并看到 osl 被移动构造,当我期待 Copy-Elision 发生时,对于这样的助手,使其零开销。这是一个调试构建工件吗?或者以某种方式复制省略不能在这里发生?如果是这样,为什么?
template <typename T> inline
OStreamLike bind(T&& val) {
OStreamLike osl(1);
osl << val;
return osl;
}
template <typename... Ts> inline
OStreamLike bind(Ts... vals) {
OStreamLike osl(sizeof...(Ts));
((osl << vals), ...);
return osl;
}