0

istreamoperator>>需要对现有对象的引用。这意味着他们所做的是分配而不是就地施工,对吗?

那么,我怎样才能跳过初始构建呢?也许编译器可以优化它,但我可能仍然需要提供我不想提供的参数。这可以用 istreams 完成吗?

...我希望能够拥有,比如说,

template <typename T> void emplace_from(std::istream stream, T* place);

适用于适用于 T 的所有类型stream >> my_t_variable。虽然,不可否认,这个函数声明看起来有点难看。

4

2 回答 2

2

提取运算符 ( ) 无法做到这一点std::istream& operator>>(std::istream&, T&)

std::istream总的来说,当然。简单地说,实现一个函数T extract(std::istream&)或类似的。它的实现几乎与提取运算符相同:读取字符流,使用输入初始化新对象,返回对象。然后你可以简单地调用:T t = extract(std::cin)

于 2016-04-12T15:05:41.003 回答
0
#include <experimental/optional>

namespace exp = std::experimental;

template<class T, class charT>
exp::optional<T> extract(std::basic_istream<charT>& is) {
    auto it = std::istream_iterator<T, charT>(is);
    if (it != decltype(it)()) {
        return *it;
    }
    return exp::optional<T>{};
}

int main()
{
    int i = *extract<int>(std::cin);
    std::cout << i;
}
于 2016-04-12T16:31:45.277 回答