2009-08-10 5 views
1

私はマクロ(FOO(name))といくつかのテンプレートクラスBar Bar>を持っているとします。別の名前のFOOを呼び出すたびに、私はBarの別のインスタンスを取得したいと思います。 Bar <>テンプレートは実際に内部で名前を取得する必要はありませんが、異なる名前でBar <のインスタンスが異なることを確認する必要があります。同じ名前(異なる翻訳単位でも)を使用するテンプレートは常にBar <>の同じインスタンスになります。彼らは外部リンケージを持っていないので、その文字リテラルはテンプレートパラメータとして渡すことはできませんを除いて、#defineのテキストがあれば、何とかテンプレートに渡すことができますか?

template<const char* x> 
class Bar 
{ 
//... stuff 
}; 

#define FOO(name) Bar<#name> 

これは動作します:だからここラフ初の試みです。プリプロセッサに "name"という一貫性のあるハッシュがあるとしたら、int(テンプレートに渡すことができます)は動作しますが、それを行う方法はありません。

アイデア?

+0

あなたは正確に何をしようとしていますか? – GManNickG

+0

C++言語の愚かな乱用) これはすぐに公開されるオープンソースライブラリの一部になるだろう。一度見ることができるようになるとここでコメントするだろう;) –

+0

これはバージョン1.2のオープンソースToastライブラリのTOAST_STATIC_INIT_PROTECTEDの実装。ドキュメントへのリンク: http://toast.sourceforge.net/group__miscgroup.html#gdb5e38486385cb4eb10848f0d573fe24 –

答えて

4

あなたが(名前空間やクラスのスコープが働くだろう)このマクロを使用する場所に応じて、あなたがタグタイプを作成し、それを使用することができますが:

template<typename T> 
class Bar 
{ 
//... stuff 
}; 

#define FOO(name) struct some_dummy_tag_for_##name {}; Bar<some_dummy_tag_for_##name> 

これが動作しない場合は、多分あなたは「缶事前にそれらの名前を宣言してください:

#define DECLARE_FOO(name) struct some_dummy_tag_for_##name {} 
#define FOO(name) Bar<some_dummy_tag_for_##name> 

// something.h 
DECLARE_FOO(foobar); 

// something.cpp 
FOO(foobar); 
+1

必ず「テンプレート」を意味しますか? – bdonlan

+0

@bdonlan:Um、ええ、私はちょうど本当に考えなくてもコードをコピーしました。ごめんなさい。修正されます。 – sbi

+0

あなたは先生です、天才です:)これは私の古いメソッドが持っていた3つの他の問題のような偶然に解決します。 –

関連する問題