私が考えることができるいくつかのオプションがあり、それぞれが独自の醜さを持っています。
unique_ptr
明らかなオプションの1つは、参照の代わりにポインター(おそらく)を使用することです。もちろん、これが機能するためには、ヒープからの割り当て、またはカスタムアロケータのいずれかが必要です。良いアロケータがあれば、このアプローチにはいくつかのメリットがあると思います。繰り返しになりますが、演算子のオーバーロードは厄介になります。
別のアプローチは、const参照ではなく、値で部分式を格納することです。このアプローチの効率はコンパイラーに大きく依存しますが、基本的には大量の一時的なものを扱っているので、最新のコンパイラーはコピー(または少なくとも多くのコピー)を最適化できると思います。
最後のアプローチでは、コードと同じ構造を維持できますが、ユーザーは式を評価する必要があります。反復可能なタイプが1つだけである必要があります。これは、式の基になるタイプです(たとえば、std::vector<int>
)。式クラスにはbegin
、end
メソッドまたは関数を定義する必要はありませんが、基になる型に変換できる必要があります。このように、のようなコードfor(auto x : expr)
はコンパイル時に失敗しますが(expr
反復可能ではないため)for(auto x : static_cast<vector<int>>(expr))
、式はすでに評価されているため、書き込みは機能します。
範囲ベースのforループを使用して式テンプレート操作を実装することを希望している場合は、式テンプレートクラスにプライベートメソッドまたは保護さbegin
れたメソッドを提供できます。end
各テンプレートクラスが他のテンプレートクラスのメソッドbegin
とend
メソッドにアクセスできることを確認してください。式テンプレートは関数のパラメーターであるため、このコンテキストでは問題ないはずです。そのため、関数内でループを作成するときに参照がぶら下がることを心配する必要はありません。