C++2zでは文字列から関数オブジェクトを生成されるtemplate関数compilingがfunctionalヘッダに追加される。std名前空間における宣言は以下のとおりだ。
template<class FunT, std::size_t Alignment, class ForwardIterator>function<FunT>compiling(ForwardIterator first, ForwardIterator last);
使い方は以下のとおりだ。
#include<functional>
#include<iostream>
#include<string>
int main()
{
std::string str="int add(int n,int m){return n + m;}";
auto func = std::compiling<int(int, int), 8>(str.begin(), str.end());
std::cout<< func(1, 2) <<std::endl;
}
FunTは返り値のstd::functionの型を指定し、Alignmentはその関数で確保される最大のメモリ容量を指定する。
ここで注意したいのはcompilingでは以下の機能しか使えない。すなわち
・組み込み型の変数定義
・組み込み型の演算子
・if, for, while文
・return文
関数呼び出しやユーザー定義型が使えないことには要注意だ。
また文字列が不合理な場合以下の様な例外が投げられる。複数の例外に当たる場合上のものが優先される。
・文法的に意味を成さない(typedefや関数が使われている場合含む)→std::bad_function_parsing
・返り値がFuncTで指定したものと合わない→std::bad_function_type
・Alignmentで指定した以上のメモリを必要とする→std::memory_over_exception
実行時に文字列を与えてそこから関数を生成することも可能となる。また将来的にはcompilingの文鳥言語版compiling_bunchoも導入される予定だ。
PR