私はテンプレート化されたclass
(それにはFoo
と呼んでいます)にはいくつかの特殊化があります。誰かが未特定のバージョンのFoo
を使用しようとすると、コンパイルが失敗するようにしたいと思います。ここで特殊なテンプレートのインスタンス化を防ぐにはどうすればいいですか?
は、私が実際に持っているものです。
template <typename Type>
class Foo
{
Foo() { cannot_instantiate_an_unspecialized_Foo(); }
// This method is NEVER defined to prevent linking.
// Its name was chosen to provide a clear explanation why the compilation failed.
void cannot_instantiate_an_unspecialized_Foo();
};
template <>
class Foo<int>
{ };
template <>
class Foo<double>
{ };
だから:
int main()
{
Foo<int> foo;
}
動作しますが:
int main()
{
Foo<char> foo;
}
はありません。
明らかに、コンパイラーチェーンは、リンク処理が行われるときにのみ不平を言います。しかし、以前にそれを不平にする方法はありますか?
boost
を使用できます。
template <typename Type>
class Foo;
template <>
class Foo<int> { };
int main(int argc, char *argv[])
{
Foo<int> f; // Fine, Foo<int> exists
Foo<char> fc; // Error, incomplete type
return 0;
}
なぜこの作業を行います。
ありがとうございました。私はあまりにも複雑なものを探していたと思う。 – ereOn
@Schnommusしかし、あなたがクラスを定義し、それがstatic_assertを持っているなら、特殊化がよりよく一致するので、インスタンス化されるべきではありませんか? –
コンパイル時ではなく、リンクステージでエラーが発行されるため、間違った判断です。そして、あなたは、非専門クラスを正確に使った場所を決して知らないでしょう。 – vladon