2016-06-09 18 views
8

Dưới đây là những gì tôi muốn làm:Cách tốt hơn để vô hiệu hóa khấu trừ tham số mẫu dựa trên đối số cho các chức năng?

template <typename T> void f(DisableDeduction<T> obj) {std::cout << obj;} 
// Here DisableDeduction<T> aliases T, but in a such way 
// that would prevent compiler from deducing T based 
// on provided argument. 

/* ... */ 

f<int>(1); // Works. 
f(1); // Error, can't deduce template parameter based on argument. 

Đây là cách tôi đang đạt được điều đó:

template <typename T> struct DisableDeduction_Internal {using type = T;}; 
template <typename T> using DisableDeduction = typename DisableDeduction_Internal<T>::type; 

Nó hoạt động hoàn hảo (như mô tả), nhưng nó giới thiệu thêm một loại helper.

Nhưng tôi có thể đạt được kết quả tương tự không có loại bổ sung không?

+3

'std :: enable_if_t '? – Jarod42

+0

@ Jarod42, bạn có muốn biến điều đó thành câu trả lời bằng ví dụ làm việc không? –

Trả lời

6

Bạn có thể làm điều đó bằng cách đặt T trong ngữ cảnh không thể trừ (ở bên trái của ::) và sử dụng std::common_type từ <type_traits>.

dụ:

template <typename T> void f(typename std::common_type<T>::type obj) {std::cout << obj;} 
+0

Cảm ơn. Tôi sẽ đặt nó vào một 'sử dụng' (như trước) để sử dụng thuận tiện hơn. – HolyBlackCat

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