投稿日: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
特にエラーが発生する事もなく、コンパイルできました。
■ 実行してみた結果
テンプレートにアサインした値が正しく出ています。
dict.ShowSection(“SHOW”); と指定した箇所が if 文となって判定されています。
# テンプレートに記述した {{#NOT_SHOW}} はソース側で指定していない為、表示されていません。
今回のサンプルでは単純な事しかやっていませんが、公式サイトのドキュメントを読むと、文字をエスケープできたり、様々な機能があるようです。
http://google-ctemplate.googlecode.com/svn/trunk/doc/index.html

