C++ メタプログラミングは機能的であるため、関数型プログラミング言語 (Haskell など) の let または where 構造に匹敵する何かを行う方法はありますか?
私は Boost::MPL を使用していますが、より長いメタ関数のためにより多くの構造が必要です。複数の関数に分割することは問題ありませんが、場合によっては let/where を使用したいと思います。
C++ メタプログラミングは機能的であるため、関数型プログラミング言語 (Haskell など) の let または where 構造に匹敵する何かを行う方法はありますか?
私は Boost::MPL を使用していますが、より長いメタ関数のためにより多くの構造が必要です。複数の関数に分割することは問題ありませんが、場合によっては let/where を使用したいと思います。
MPL 自体は節をサポートしていませんlet
が、その上に構築された一部のライブラリは節をサポートしています。一例はmetamonadです。名前が示すように、他の高レベルの機能概念 (モナド) もサポートしています。大きな欠点は、metamonad
Boost ディストリビューションの公式の一部ではないことです。
MPL の回避策に関する限り、物事を関数に分割し、より多くの名前空間を使用してそれらをグループ化し、重要なシンボルを最上位の名前空間にインポートすることがおそらく最良の選択です。
Boost.Phoenix には、より高次の関数コンテキストでローカル変数を宣言できるletという構造があります。とはいえ、これはこれでレベルが高いと思います。コンパイル時ではなく、まだ実行時です。
リンクされたページから:
let(_x = 1, _y = ", World")
[
// _x here is an int: 1
let(_x = "Hello") // hides the outer _x
[
cout << _x << _y // prints "Hello, World"
]
]