C++入門/自作の演算子

柴田祐樹,東京都立大学,情報科学科

自作の演算子を定義することもC++では可能である.これくらい言語規格に含めていてほしいものだが,含まれていないので,以下のように工夫を凝らして実装する.Stack overflowでも紹介されている.これはなかなか思いつかない.

#include <cmath> enum class Operators_K{ A }; struct cOperators_K{ int a; cOperators_K(int a_){ a = a_; } }; cOperators_K operator*(int a, Operators_K){ return cOperators_K(a); } int operator*(cOperators_K b, int a){ return std::pow(b.a, a); } #define 冪 *Operators_K::A* #include <iostream> using namespace std; int main(){ int b = 24; cout << b << "\n"; }

実行結果を以下に示す.日本語がコンパイルできるコンパイラが必要である.意図した結果となっている.

hiroki@hiroki-home:~/git/cpp$ g++ op.cpp hiroki@hiroki-home:~/git/cpp$ ./a.out 16

本当は,∈,∧,∇などの演算子で使われる記号を使いたいところだが,g++ では数学の演算子で使う記号の使用が認められていない.ほかのUTF-8の範疇の記号は使えるというのに,2022年現在数学記号に対し特に使用制限がかかっている.今後改定されることを願う.もし今の段階で数学記号を演算子として定義したい場合,ソースコードをg++に渡す前に,制限文字を別の文字列へ変換するスクリプトを前処理として起動するなどの工夫が必要である.Microsoftのコンパイラはこの点の制限が緩かったので,数学記号も使えそうではある.前処理スクリプトを使ってでも積極的に数学記号を使っていき,gccの開発チームに価値を認めさせて行きたいところだ.