C++11用のクラスひな形生成スクリプトを作ってみた このエントリーをはてなブックマークに追加

C++ で開発する上で、クラスを一つ一つ実装するたびに毎回同じようなことを書かされるのは冗長なので、だいたいこんな感じになるよねという範囲のひな形を生成するスクリプトを perl で記述してみました。

Getopt::Compact モジュールを使用しています。ご利用の際にはそちらも合わせてインストールしてあげてください。

ツールの特徴としては以下のとおりです。

  • 名前空間とクラス名を指定すると、それらから類推される名前でファイル名や include guard シンボル名を設定し、ひな形を生成する。これらの指定は必須。
    • 名前空間は 1階層にしか対応してません…。
  • doxygen フォーマット (javadoc 風) でコメントを付加。
    • -s オプションでクラスの概要 (@brief) を指定可能。省略した場合はクラス名を使用。
  • クラスの public 継承、仮想クラス、インタフェースクラスに対応。
  • Pimpl に対応 (構造体及びメンバ変数名は固定です…)。
  • Boost.noncopyable に対応。
  • コピーコンストラクタ、ムーブコンストラクタを自力実装するようにプレースホルダを設ける機能に対応。

使い方ですが、例えば以下のようにすると、

$ perl cppgen.pl -c Observer -d hoge -s 'オブザーバーインタフェース' -in
$ perl cppgen.pl -c Subject -d hoge -s 'サブジェクト抽象クラス' -vpn
$ perl cppgen.pl -c ConsoleView -d hoge -s 'コンソールビュー抽象クラス' -e Subject -p
$ perl cppgen.pl -c StaticText -d hoge -s 'コンソールに静的にテキストを表示するビュークラス' -e ConsoleView -p
$ perl cppgen.pl -c DateTime -d hoge -s '日時を扱うクラス' -pCM
$ perl cppgen.pl -c WatchController -d hoge -s '時計コントローラ' -e Observer -p
$ perl cppgen.pl -c ConsoleManager -d hoge -s 'コンソール操作管理クラス' -pn
$ ls
console-manager.cpp  console-view.h  date-time.h      static-text.h  watch-controller.cpp
console-manager.h    cppgen.pl       observer.h       subject.cpp    watch-controller.h
console-view.cpp     date-time.cpp   static-text.cpp  subject.h

以下のような構成でファイルが生成されます。

  • Observer クラス … noncopyable なインタフェースクラス (observer.h のみ)
  • Subject クラス … Pimpl を持つ noncopyable な抽象クラス (subject.h, subject.cpp)
  • ConsoleView クラス … Subject を継承し、 Pimpl を持つ抽象クラス (console-view.h, console-view.cpp)
    • 他のクラスを継承するクラスは強制的に抽象クラスになります (デストラクタが virtual になる)。当たり前ですが…。
  • StaticText クラス … ConsoleView クラスを継承し、 Pimpl を持つ抽象クラス (static-text.h, static-text.cpp)
  • DateTime クラス … Pimpl を持ち、コピーコンストラクタ、ムーブコンストラクタのプレースホルダを持つクラス (date-time.h, date-time.cpp)
  • WatchController クラス … Observer クラスを継承し、 Pimpl を持つ抽象クラス (watch-controller.h, watch-controller.cpp)
  • ConsoleManager クラス … Pimpl を持つ noncopyable なクラス (console-manager.h, console-manager.cpp)

詳しくは -h オプションでヘルプを見るか、ソースを参照してください (^_^;


2014/8/22 – 追記
テンプレートクラスに対応しました。

$ perl gencpp.pl -c DomNodeFromId -d hoge -t 'class NodeType' -ns 'ID を指定して DOM ノードを検索するラッパーオブジェクトクラス'

とかやると、以下の内容のヘッダファイル dom-node-from-id.h のみが生成されます。

/**
    @file   dom-node-from-id.h
    @brief  ID を指定して DOM ノードを検索するラッパーオブジェクトクラス定義  
*/
#ifndef HOGE_DOM_NODE_FROM_ID_H
#define HOGE_DOM_NODE_FROM_ID_H


namespace hoge {

/**
    @brief  ID を指定して DOM ノードを検索するラッパーオブジェクトクラス  
*/
template <class NodeType>
class DomNodeFromId {
    /// コピーコンストラクタ (使用禁止)
    DomNodeFromId(DomNodeFromId const&) = delete;
    /// コピー代入演算子 (使用禁止)
    DomNodeFromId & operator=(DomNodeFromId const&) = delete;
    /// ムーブコンストラクタ (使用禁止)
    DomNodeFromId(DomNodeFromId &&) = delete;
    /// ムーブ代入演算子 (使用禁止)
    DomNodeFromId & operator=(DomNodeFromId &&) = delete;

public:
    /**
        @brief  デフォルトコンストラクタ  
    */
    DomNodeFromId()
    {
        //TODO: デフォルト生成を行う処理の詳細をここに記述
    }
    /**
        @brief  デストラクタ  
    */
    ~DomNodeFromId() = default;
};

}   //namespace hoge

#endif  //HOGE_DOM_NODE_FROM_ID_H

見ての通り、 -n オプションと併用すると Boost.noncopyable を使用する代わりに、コピーやらムーブやらのあれこれを = delete しまくるコードが挿入されます。それから、デフォルトコンストラクタのプレースホルダはクラス定義内に確保され、デストラクタは = default で定義されます。

この他、 -CM オプションあたりが併用可能となっていますが、抽象クラスになるようなオプション (-vie) や、 Pimpl モード (-p) との併用はできません。

2014 年 8 月 20 日 by 村山 俊之

タグ: , , ,

コメントをどうぞ