私たちは、特定のポリシーまたはタイプでは動作しないいくつかのメソッドを持つ複雑なテンプレートクラスを持っています。したがって、これらの型を(コンパイル時に、型型を使用して)検出すると、私たちは素敵なメッセージで静的なアサーションを起動します。いくつかのメソッドを手動テンプレートのインスタンス化から除外できますか?
ここでは、多くの手動テンプレートインスタンシエーションも行っています。部分的には、メソッドをコンパイルしてメソッドをシンタックスチェックするように強制されます。また、ライブラリユーザーのコンパイル時間も短縮されます。問題は、静的アサーションが常に発生し、その結果、問題のテンプレートクラスを手動でインスタンス化できないということです。
回避策はありますか?
EDIT:EDIT2
// header
template <typename T>
class someClass
{
void someFunc() {}
void someFunc1() { static_assert(false, assertion_failed); }
};
// source
template someClass<int>; // Explicit instantiation
:は、ここでの例では、someFunc1()に失敗します。この場合、(明示的にインスタンス化され、それをより明確にするために、ここでは別の例である。この時間をあなたコメントを外して[2]とすると、静的アサーションが発生するはずです。コメントアウト[2]とコメントを外して[1]をコメントアウトしてください。静的アサーションwi明示的にテンプレートをインスタンス化しているため、起動します。私はそれに伴うメリットのために明示的なインスタンシエーションを削除しないようにしたいと考えています(上記のメリットを参照)。
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;
}
問題の内容は明らかではありませんが、問題の範囲から見るとenable_ifはあなたのためです(http://www.boost.org/doc/libs/1_48_0/libs/utility/ enable_if.html) – bobah
@bobah:それはまったく悪い考えではありません...私はそれを調べます。私が確認できる簡単な例を用意することができれば、答えとしてマークします。 – Samaursa
私は細部の不足について不平を言う他の人に同意します。しかし、とにかく、これは私に鐘を鳴らしました: "問題は、静的なアサーションは常に解雇されるということです"。 http://www.boost.org/doc/libs/1_48_0/doc/html/boost_staticassert.html#boost_staticassert.templates、最後の発言:これはあなたの問題ですか? –