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 に答える