コンパイル時eval作ってみた
作ってみたネタです、という訳でまずはリポジトリ
https://github.com/minamiyama1994/Compile-Time-Eval
使い方はこんな感じです
#include<typeinfo>
#include"CTE/CTE.hpp"
auto main ( ) -> int
{
auto eval1 = CTE_EVAL ( "1+20*10/(5+5)" ) ;
auto eval2 = CTE_EVAL ( "1+20*10/(5+5)+.5" ) ;
auto eval3 = CTE_EVAL ( u8R"*****("Hello"+" "+"World")*****" ) ;
std::cout << eval1 << std::endl ;
std::cout << typeid ( eval1 ).name ( ) << std::endl ;
std::cout << eval2 << std::endl ;
std::cout << typeid ( eval2 ).name ( ) << std::endl ;
std::cout << eval3 << std::endl ;
std::cout << typeid ( eval3 ).name ( ) << std::endl ;
}
手元のGCC4.8.1だとこのような出力となりました
$ ./prog
21
i
21.5
d
Hello World
Ss
さすがにコンパイル時リフレクションなどの機能がないと変数を取り込んだりは難しいため、定数のみで構成された式を対象としています
原理としては簡単で、以前紹介した型安全printfと同じで、中3女子氏のSproutと僕の作ったFTMPを併用し、コンパイル時文字列を型に落としこんで後はTMPでゴリゴリ色々やっているだけです、細かいことが気になる人はコードを見てください(無責任)
HaskellやNemerle、Lispなどだと簡単なevalですが、C++でも一応似たようなことは出来るんだよ、っていう、まあそれだけの話でした。
なお、厳密には結果がconstexprではないので、コンパイル時というのは多少誇張が入っているのですが、まあ、ご容赦ください
なお、C++14です、C++11縛りは(以下略)