設計契約を実施するようなテンプレートクラスを実装することは可能ですか?おそらくstatic_assertを使用していますか?
特定のメソッドが存在するかどうかを確認するには(この例と非常によく似ています):
struct Hello
{
};
struct Generic {
int operator++()
{
return 5;
}
};
// SFINAE test
template <typename T>
class has_operator_plusplus
{
typedef char one;
typedef long two;
template <typename C> static one test( decltype(&C::operator++) ) ;
template <typename C> static two test(...);
public:
enum { value = sizeof(test<T>(0)) == sizeof(char) };
};
int main(int argc, char *argv[])
{
// the first check breaks the build
//static_assert( has_operator_plusplus<Hello>::value, "has no operator" );
static_assert( has_operator_plusplus<Generic>::value, "has no operator" );
}
これは良いデザインですか?
はい、ビルドを中断することでエラーが非常に速くキャッチされ、クラスのユーザーはドキュメントを読む必要がないためです(ほとんどの人は通常、プログラミング時にその部分をスキップします)