選択タイプの Matrix オブジェクトの LoadFile 関数 (メンバー関数) のインスタンス化を防ぐことはできますか?
ここでの最善の策static_assert
は、ブロックされた型でインスタンス化されたクラスのバージョンでメソッドを呼び出そうとすると、コンパイラ エラーが発生する を使用することです。std::enable_if
、およびメソッド自体を選択的に「無効化」するその他のメソッドを使用するには、コンパイラ エラーを防ぐために、問題のメソッドの有無にかかわらず、クラスの部分的または完全な特殊化を作成する必要があります。たとえば、知る限り、次のことはできません。
template <typename T>
struct test
{
static const bool value = false;
};
template<>
struct test<double>
{
static const bool value = true;
};
template<typename T>
struct example
{
void print() { cout << "Printing value from print()" << endl; }
typename enable_if<test<T>::value, T>::type another_print()
{
cout << "Printing value from another_print()" << endl;
return T();
}
};
などをインスタンス化しようとするexample<int>
と、オブジェクト型のインスタンス化の時点でコンパイラ エラーが発生します。単に電話example<int>::print()
して大丈夫というわけではなく、電話を選択した場合にのみ問題が発生しますexample<int>::another_print()
。のスペシャライゼーションでexample<T>
問題を回避できますが、それは少し混乱する可能性があります。最初に推測static_assert
されたように、問題の原因を説明するエンド ユーザーへの適切なメッセージと共に、a がおそらく最も扱いやすいケースでしょう。
コンパイラ エラーを作成することが目標であり、それを行うのは良いことです。メソッドのインスタンス化をブロックし、エンド ユーザーがそれを呼び出すことにした場合、いずれにしてもコンパイラ エラーが発生します。のないバージョンでstatic_assert
は、クラスのユーザーがおそらく非常に冗長なコンパイラ エラー メッセージを解析しようとするため、多くの頭を悩ませることになりますstatic_assert
。