A typedef
không phải là macro mà ví dụ thứ hai của bạn không tương đương với ví dụ đầu tiên. Trong trường hợp đầu tiên, typedef
của bạn xác định một hàm functor, sau đó sử dụng loại đó trong toán tử cast của loại functor. Trong lần thứ hai, toán tử sử dụng cú pháp không đúng vì không có toán tử nào được chỉ định vì không có kiểu nào. Tôi không chắc làm thế nào để viết nó nhưng có một cách thường.
Kiểu chữ không thực sự cần thiết ngoại trừ việc tạo mã có thể đọc được trong TMP và thậm chí sau đó nó phụ thuộc vào loại con người của bạn.
Vì tôi không thể đưa ra cú pháp thay thế, có thể typedef là cần thiết trong một số trường hợp. Tôi chỉ nghĩ về một người khác có thể. Giả sử bạn đã có một mẫu với chuyên ngành trong đó có một phương pháp tĩnh với một kiểu trả về như dưới đây:
template <typename T>
struct WhateverHandler
{
typedef T rType;
static rType Whatever() { return rType(); }
};
template <>
struct WhateverHandler<std::string>
{
typedef std::string rType;
static rType Whatever() { return rType(); }
};
Tôi nghĩ rằng trong trường hợp này cũng có thể bạn sẽ cần typedef để gọi phương thức tĩnh bất kể chuyên môn hóa như nếu không phương pháp có thể gây nhầm lẫn cho trình biên dịch vì các kiểu trả về sẽ khác nhau nhưng nó sẽ không phải là quá tải thích hợp.
template <typename T>
struct WhateverUser
{
typename WhateverHandler<T>::rType DoWhatever()
{
return WhateverHandler<T>::template Whatever();
}
};
Tại sao bạn sẽ khai báo chức năng mà không có typedef? –
Chuyển đổi sang bool an toàn có thực sự cần thiết không? –
@Tad: Có vẻ như hữu ích trong trường hợp cụ thể của tôi (một mẫu tùy chọn 'tùy chọn'). –
fredoverflow