是否可以实现这样一个执行设计合同的模板类?可能使用 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" );
}
这是一个好的设计吗?
是的,因为通过中断构建,错误会很快被捕获,并且该类的用户不必阅读文档(大多数人在编程时通常会跳过该部分)