我可以防止为选择类型的 Matrix 对象实例化 LoadFile 函数(它是一个成员函数)吗?
您最好的选择是使用static_assert
当您尝试在使用阻塞类型实例化的类版本中调用该方法时会产生编译器错误的方法。使用std::enable_if
, 和其他可以选择性地“禁用”方法本身的方法将要求您创建带有和不带有相关方法的类的部分或全部特化,以防止编译器错误。例如,AFAIK,您不能执行以下操作:
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>
可以让你解决这个问题,但这可能有点混乱。正如最初推测的那样,astatic_assert
可能是最容易处理的情况,同时还会向最终用户发送一条很好的消息来解释问题所在。
请记住,创建编译器错误是目标,这是一个很好的目标。如果您阻止了一个方法被实例化,并且最终用户决定调用它,那么无论哪种方式,您最终都会遇到编译器错误。没有 的版本static_assert
会留下很多令人头疼的问题,因为您的类的用户试图解析可能非常冗长的编译器错误消息,因为该static_assert
方法是直接且切中要害的。