C++でクラスを大量に作るときに,同じようなファイルばっかり何個も作るのがめんどくさかったので,自動生成するスクリプトを作ってみた.要 Ruby.
実行手順は,
./ClassFileGenerator.rb author ClassName (BaseClassName)
プログラムの作者と,クラス名を引数で渡すと, .h と .cpp が自動的に生成される.(で,gvim -o で開く.)
クラス名を続けて2つ書くと,2つ目のクラスを基底クラスとしてクラスが作られる.
ClassFileGenerator.rb
#!/usr/bin/ruby require 'date' require 'erb' if ARGV.length < 2 print "usage #{$0} author classname [baseclassname]\n" exit -1 end author=ARGV[0] classname=ARGV[1] baseclass="" date=Date.today.to_s if ARGV.length >= 3 baseclass=ARGV[2] if !File.exist?(baseclass+".h") system "#{$0} #{author} #{baseclass}" end end if File.exist?(classname+".h") || File.exist?(classname+".cpp") print "class #{classname} already exists.\n" exit -1 end h_template=ERB.new(open("H_template.erb").read) cpp_template=ERB.new(open("CPP_template.erb").read) open(classname+".h","w") do |f| f.print h_template.result(binding) end open(classname+".cpp","w") do |f| f.print cpp_template.result(binding) end system "gvim #{classname}.h #{classname}.cpp -O &"
これとは別に,以下の2つのテンプレートファイルが必要です.
H_template.erb
/*! * @file <%= classname %>.h * @author <%= author %> * @date Last Change:<%= date %>. */ #ifndef <%= classname.upcase %>_H__ #define <%= classname.upcase %>_H__ <% if baseclass!="" then %> #include "<%= baseclass %>.h" class <%= classname %>:public <%= baseclass %>{ <% else %> class <%= classname %>{ <% end %> public: <%= classname %>(); virtual ~<%= classname %>(); protected: private: }; #endif
CPP_template.erb
/*! * @file <%= classname %>.cpp * @author <%= author %> * @date Last Change:<%= date %>. */ #include "<%= classname %>.h" /*! * @brief デフォルトコンストラクタ */ <%= classname %>::<%= classname %>(){ } /*! * @brief デストラクタ */ <%= classname %>::~<%= classname %>(){ }
ERB使ってみたかっただけなんです><