LoginSignup
5
5

More than 5 years have passed since last update.

C++でコンパイル時eval(誇張あり)

Last updated at Posted at 2014-05-07

コンパイル時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縛りは(以下略)

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5