特定のポリシーまたはタイプでは機能しないいくつかのメソッドを持つ複雑なテンプレート クラスがあります。したがって、これらの型を (コンパイル時に型特性を使用して) 検出すると、ナイス メッセージと共に静的アサーションを起動します。
現在、手動でテンプレートをインスタンス化する作業も数多く行っています。部分的には、メソッドが構文チェックのためにコンパイラーに強制されるようにするためです。また、ライブラリ ユーザーのコンパイル時間も短縮されます。問題は、静的アサーションが常に起動されるため、問題のテンプレート クラスを手動でインスタンス化できないことです。
これに対する回避策はありますか?
編集:より明確にするために、ここに例を示します (この場合の明示的なインスタンス化は someFunc1() で失敗します:
// header
template <typename T>
class someClass
{
void someFunc() {}
void someFunc1() { static_assert(false, assertion_failed); }
};
// source
template someClass<int>; // Explicit instantiation
EDIT2:これは別の例です。今回は、それをコンパイルして、私が何を意味するかを確認できます。まず、すぐにコンパイルします。コードがコンパイルされるはずです。次に[2] のコメントを外すと、静的アサーションが起動します。[2] をコメントアウトし、 [1]をコメント解除します。テンプレートを明示的にインスタンス化しているため、静的アサーションが発生します。明示的なインスタンス化にはメリットがあるため、削除は避けたいと思います (メリットについては上記を参照してください)。
namespace Loki
{
template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
}
#define LOKI_STATIC_CHECK(expr, msg) \
{ Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
template <typename T>
class foo
{
public:
void func() {}
void func1() { LOKI_STATIC_CHECK(sizeof(T) == 4, Assertion_error); }
};
template foo<int>;
//template foo<double>; // [1]
int main()
{
foo<int> a;
a.func1();
foo<double> b;
//b.func1(); //[2]
return 0;
}