8

この質問に触発されて、与えられた2つのテンプレートのインスタンス化を検出するために導入できるコンパイル時のチェックがあるかどうか疑問に思っています:

template <typename T>
class Templ...

typedef Templ<std::string> stringInstance;
typedef Templ<double> doubleInstance;

同じ定義から構築されているか、Templテンプレートの異なる特殊化から構築されている場合

したがって、基本的に仮想テンプレート関数は次のように動作します。

template <typename T>
class Templ
{}

template <>
class Templ<std::string>
{}

template <>
class Templ<double>
{}

template <typename T1,typename T2>
class Belong_To_Same_Templ_Definition
{}

//tests
typedef Templ<std::string> stringInstance;
typedef Templ<double> doubleInstance;
typedef Templ<int> intInstance;
typedef Templ<char> charInstance;

assert( Belong_To_Same_Templ_Definition< intInstance , charInstance >::value == true);
assert( Belong_To_Same_Templ_Definition< intInstance , doubleInstance >::value == false);
assert( Belong_To_Same_Templ_Definition< stringInstance , doubleInstance >::value == false);

この種のメタ関数を作成することは可能ですか?

4

1 に答える 1

3

正直なところ、そうは思えません (狡猾なトリックを完全に排除することはできませんが)。

特定の特殊化 (それを選択する型引数の外側) を比較するための第一級の同一性はありません。

したがって、必要に応じて独自のテンプレートで機能させることもできますが、既存のテンプレートのアドホックな推論を作成することはできません。

2 つのインスタンス化が互換性のあるレイアウトを持っているかどうかを判断できないという意味で、いずれにせよ機能しないことも考慮してください。専門。Templ<int>Templ<char>

于 2013-01-09T18:59:08.677 に答える