OPEN SOURCE LABORATORY

投稿日:2008年7月9日 -投稿者 ohyanagi

Google ctemplate を使ってみる

こんにちは。おおやなぎです。

以前 C++ で XML フォーマットの文字列を生成する必要がありました。
あらかじめフォーマットが決まっていて、値の一部だけ動的に書き変えたいという場合には、テンプレートエンジンが便利です。

その時は諸事情があり、結局テンプレートエンジンは使用せず、DOM で XML フォーマットの文字列を生成しましたが、折角なので取り上げたいと思います。

C++ の汎用的なテンプレートエンジンを検索した所、一番最初に見つけたのが、
google-ctemplate でした。
Google が開発したテンプレートエンジンです。

公式サイトのサンプルにあるように、 C++ のソースからテンプレートに値を設定し、実行するとテンプレートの値を置換して応答してくれます。
今回は Linux Ubuntu 8.04 にソースからインストールしてみました。
# RPM でも提供されているので、 Redhat 系のディストリビューションを使用されている方はパッケージからインストール可能です。

■ 公式サイトから tar.gz で圧縮されているファイルを取得して、適当な場所に展開します。
# cd /usr/local/src/
# wget http://google-ctemplate.googlecode.com/files/ctemplate-0.90.tar.gz
# tar xvzf ctemplate-0.90.tar.gz

■ コンパイルし、インストールをします。
# cd ctemplate-0.90
# ./configure
# make
# sudo make install

./configure 時に –prefix= で好きな場所にインストールできますが、今回はオプションを指定せずにインストールしました。
特にコンパイルエラーもなく、インストールできました。

■ 早速サンプルのコードを書いてみました。
# cd ~/src/ctemplate/
# vi example.cc

#include <stdlib.h>
#include <string>
#include <iostream>
#include <google/template.h>
int main(int argc, char** argv)
{
    google::TemplateDictionary dict(“example”);
    dict.SetValue(“HELLO_JA”, “こんにちはこんにちは!”);
    dict.SetValue(“HELLO”, “Hello World”);
    int value = rand() % 100000;
    dict.SetIntValue(“VALUE”, value);

    dict.ShowSection(“SHOW”);

    google::Template* tpl = google::Template::GetTemplate(“example.tpl”,
                                                          google::DO_NOT_STRIP);
    std::string output;
    tpl->Expand(&output, &dict);
    std::cout << output;
    return 0;
}
ほぼ公式サイトのコードと同じです。

■ 次にテンプレート側を作成します。
# vi example.tpl
{{HELLO}},
{{HELLO_JA}}
Numeric {{VALUE}}

{{#SHOW}}
これは表示される
{{/SHOW}}

{{#NOT_SHOW}}
これは表示されない
{{/NOT_SHOW}}

■ 作成した .cc ファイルをコンパイルします。
今回はスレッドを使用していないので、nothreads を使用します。
# gcc -o example example.cc -lctemplate_nothreads
特にエラーが発生する事もなく、コンパイルできました。

■ 実行してみた結果

ctemplate.jpg

テンプレートにアサインした値が正しく出ています。
dict.ShowSection(“SHOW”); と指定した箇所が if 文となって判定されています。
# テンプレートに記述した {{#NOT_SHOW}} はソース側で指定していない為、表示されていません。

今回のサンプルでは単純な事しかやっていませんが、公式サイトのドキュメントを読むと、文字をエスケープできたり、様々な機能があるようです。
http://google-ctemplate.googlecode.com/svn/trunk/doc/index.html