Chắc chắn, sử dụng is_specialization_of
(liên kết thực hiện và cố định từ here):
template<typename Type, bool IsTuple = is_specialization_of<Type, std::tuple>::value>
bool f(Type* x);
Câu hỏi là, tuy nhiên, bạn có thực sự muốn điều đó? Thông thường, nếu bạn cần biết nếu một kiểu là một bộ tuple, bạn cần xử lý đặc biệt cho các bộ dữ liệu và thường phải làm với các đối số mẫu của nó. Như vậy, bạn có thể muốn dính vào phiên bản quá tải của bạn.
Edit: Vì bạn nói bạn chỉ cần một phần nhỏ chuyên, tôi khuyên bạn nên quá tải nhưng chỉ cho một phần đặc biệt nhỏ:
template<class T>
bool f(T* x){
// common parts...
f_special_part(x);
// common parts...
}
với
template<class T>
void f_special_part(T* x){ /* general case */ }
template<class... Args>
void f_special_part(std::tuple<Args...>* x){ /* special tuple case */ }
Trong thời gian bình thường này có thể là nguy hiểm và một chuyên môn hóa sẽ thích hợp hơn. Nhưng hàm này là một hàm lớn, và chỉ có một 'if' nhỏ bên trong thay đổi kiểu tuple hay không. – Vincent
Sử dụng tham số mẫu phụ cũng có nghĩa là có thể gọi rõ ràng 'f, false> 'hoặc' f ', có thể tránh được bằng cách kiểm tra' is_specialization_of' trong phần hàm. –
hvd
@Vincent: Sau đó, tôi thực sự khuyên bạn nên gửi thẻ thay vì thời gian chạy 'if'. :) – Xeo