単純なコンパイル時のメタプログラミングで実際に実行できるコードを書いています。コンパイル時のシンボルとして空の構造体タグを使用するのが一般的な方法です。いくつかの実行時構成要素でタグを装飾する必要があります。静的変数は(メタプログラミングを有効にするための)唯一の方法のようですが、静的変数にはグローバル宣言が必要です。このScottMyersの提案(Effective C ++の第3版から)を回避するために、静的変数をクラス変数としてではなく関数内で宣言することによって静的変数の初期化を順序付けることについて頭に浮かびました。
そこで、次のコードを思いつきました。私の仮説は、実行時に文字列リテラルを使用できるコンパイル時のシンボルを作成できるようにするというものです。依存するテンプレートクラスを初期化する前にランタイムフィールドにデータを入力する限り、これが正しく機能することを願っています。。
#include <string>
template<class Instance>
class TheBestThing {
public:
static void set_name(const char * name_in) {
get_name() = std::string(name_in);
}
static void set_fs_location(const char * fs_location_in) {
get_fs_location() = std::string(fs_location_in);
}
static std::string & get_fs_location() {
static std::string fs_location;
return fs_location;
}
static std::string & get_name() {
static std::string name;
return name;
}
};
struct tag {};
typedef TheBestThing<tag> tbt;
int main()
{
tbt::set_name("xyz");
tbt::set_fs_location("/etc/lala");
ImportantObject<tbt> SinceSlicedBread;
}
編集: コミュニティウィキを作成しました。