Có cách nào tốt hơn để thực hiện những việc sau không?So sánh loại mẫu với giá trị số không đổi
Tôi có một lớp vector, với chức năng sau:
template <typename T>
bool Vector3<T>::IsUnitVector() const
{
return IsAlmostEqual(this->GetLength(), One<T>::Value());
}
Như T có thể float hay double (Tôi đang sử dụng rõ ràng mẫu instantiation để đảm bảo chỉ những loại được hỗ trợ), tôi đã phải tạo ra một lớp helper, mà trả về giá trị là 1, trong các loại hình chính xác:
template <typename T>
struct One
{
static T Value();
};
template <>
struct One<int>
{
static int Value() { return 1; }
};
template <>
struct One<float>
{
static float Value() { return 1.0f; }
};
template <>
struct One<double>
{
static double Value() { return 1.0; }
};
Đây không phải là quá xấu cho đến khi tôi nhận ra tôi cần phải tạo ra một lớp Zero
cũng để so sánh khác. Vì vậy, câu hỏi của tôi là, có cách nào tốt hơn để đạt được điều này? tất cả
Tôi nghĩ điều này rất phổ biến. Bạn đã cố gắng chỉ nói 'return 1;' trong phiên bản không chuyên biệt của 'One'? Tôi nghĩ rằng điều này sẽ làm điều đó nhờ chuyển đổi ngầm định. –
leemes
Tôi đã làm, nhưng vì IsAlmostEqual là templated, trình biên dịch không biết loại nào để sử dụng (vì int có thể được chuyển đổi sang float, double etc). –