2017-03-06 18 views
5

Tôi có đoạn mã sau:C++ làm loại biến phụ thuộc vào ngữ cảnh?

// Case #1 
float f = 1.0f; 
float f2 = sqrt(f * pi); 

// Case #2 
double d = 1.0; 
double d2 = sqrt(d * pi); 

Có cách nào để xác định các biến pi để operator*sqrt sẽ hoạt động trên float s trong Case # 1, nhưng sẽ hoạt động trên double s trong trường hợp # 2?

Có lẽ có thể xảy ra với các mẫu biến C++ 14?

Trả lời

11

Sắp xếp. Bạn chắc chắn có thể định nghĩa như một pi:

template <class T> constexpr double pi = 3.14159...; 
template <> constexpr long double pi<long double> = 3.14159...L; 
template <> constexpr float pi<float> = 3.14159...F; 

Nhưng bạn phải xác định những pi bạn muốn:

float f2 = sqrt(f * pi<float>); 
double d2 = sqrt(d * pi<double>); 

trực tiếp hơn, bạn có thể xác định một số pi đối tượng mà chỉ đã quá tải operator* tùy trên loại:

struct Pi { 
    template <class T> 
    decltype(pi<T>) operator*(T val) { return val * pi<T>; } 

    template <class T> 
    friend decltype(pi<T>) operator*(T val, Pi) { return pi<T> * val; } 
}; 

Điều đó cho phép bạn có được cú pháp bạn muốn, nhưng điều đó thật lạ lùng, đừng làm điều đó.

+0

@LWimsey Yep, lỗi đánh máy, cảm ơn. – Barry

+0

@ T.C. Một cái gì đó như thế? – Barry

+0

Bạn có thể làm cho nó đơn giản hơn - việc triển khai mặc định nên xác định giá trị 'double' thay vì' int'. 'mẫu constexpr double pi = 3.0;' – Orient

Các vấn đề liên quan