Tại sao việc khấu trừ loại tự động chỉ có thể thực hiện cho các chức năng chứ không phải cho các Lớp học?Loại khấu trừ mẫu trong C++ cho Class vs Chức năng?
Trả lời
Trong những trường hợp cụ thể mà bạn luôn có thể làm như std::make_pair
:
template<class T>
make_foo(T val) {
return foo<T>(val);
}
EDIT: Tôi chỉ tìm thấy những điều sau đây trong "The C++ Programming Language, Third Edition", trang 335. Bjarne nói:
Lưu ý rằng đối số mẫu lớp là không bao giờ được suy luận. Lý do là sự linh hoạt của được cung cấp bởi một số nhà thầu xây dựng cho một lớp học sẽ làm cho không thể khấu trừ như vậy trong nhiều trường hợp và làm mờ nhiều hơn nữa.
Điều này tất nhiên là rất chủ quan. Đã có một số cuộc thảo luận về điều này trong comp.std.c++
và sự đồng thuận dường như là không có lý do tại sao nó không thể được hỗ trợ. Cho dù đó có phải là ý hay hay không là một câu hỏi khác ...
Tôi nghĩ rằng chuyển đổi loại ngầm định chỉ áp dụng cho các đối số hàm để trình biên dịch có thể suy ra nó để làm cho hàm gọi thành công.
Nhưng làm thế nào nó có thể suy ra loại bạn muốn có lớp đó.
Chúng tôi phải đợi 4 ngày như vậy khi chúng tôi có Trình biên dịch dựa trên AI để đọc suy nghĩ của chúng tôi.
-1 Theo như tôi biết, quyền lực tâm linh không phải là một phần của bất kỳ chương trình nghiên cứu AI nào. Ngoài ra, trong khi tôi nhận ra rằng tiếng Anh không phải là ngôn ngữ đầu tiên của mọi người, việc lạm dụng '4' là không thể tha thứ. –
+1 cho biết, cho đến những ngày khi trình biên dịch có thể "biết những gì bạn đang cố gắng làm" và rất đáng tin cậy ... đó là một khả năng. Chỉ cần thêm một lá cờ vào makefile. –
Không cần AI - GCC7 tuyên bố hỗ trợ cho việc khấu trừ đối số mẫu cho các mẫu lớp: https://gcc.gnu.org/projects/cxx-status.html http://www.open-std.org/jtc1/sc22/wg21 /docs/papers/2016/p0091r3.html Vì vậy, hãy giữ lâu hơn một chút. ;) – Xupicor
Trong trường hợp có cuộc gọi hàm, trình biên dịch sẽ loại bỏ kiểu mẫu từ kiểu đối số. Ví dụ: std::max -function. Trình biên dịch sử dụng loại đối số để suy ra tham số mẫu. Điều này không allways làm việc, như không phải tất cả các cuộc gọi là unambigous.
int a = 5;
float b = 10;
double result1 = std::min(a, b); // error: template parameter ambigous
double result2 = std::min<double>(a, b); // explicit parameter enforces use of conversion
Trong trường hợp một lớp mẫu, có thể không phải là có thể. Ví dụ: lớp học này:
template< class T>
class Foo {
public:
Foo();
void Bar(int a);
private:
T m_Member;
};
Loại T không bao giờ xuất hiện trong bất kỳ cuộc gọi hàm nào, do đó trình biên dịch không có gợi ý gì, loại nào nên được sử dụng.
Vì vậy, nó không phải luôn luôn có thể, nhưng, như bạn chỉ ra, không phải là nó cho các chức năng. Vì vậy, điều đó không thực sự giải thích tại sao nó không được hỗ trợ. –
Tôi không biết tại sao nó không được hỗ trợ (một giải pháp nỗ lực tốt nhất sẽ có thể hiểu được), nhưng câu hỏi là, nếu có thể. Tôi nghĩ rằng tôi đã trả lời rằng, vì vậy tôi không hiểu downvote. –
Tôi nghĩ anh ấy hỏi * tại sao * không thể, không * cho dù * có thể. –
Tại Kona meeting Mẫu tham số khấu trừ cho nhà xây dựng (P0091R0) đã được phê duyệt, có nghĩa là trong C++ 17 chúng ta sẽ có thể viết:
pair p1{"foo"s, 12};
auto p2 = pair{"foo"s, 12};
f(pair{"foo"s, 12});
- 1. Chức năng mẫu mẫu và khấu trừ tham số
- 2. SFINAE, khấu trừ vs instantiation
- 3. khấu trừ đối số mẫu cho các hàm tạo
- 4. Chức năng Scala vs Class Dichotomy
- 5. Khoản khấu trừ kiểu trả về với nguyên mẫu rõ ràng trong C++
- 6. Chức năng mẫu trong C# - Loại trả về?
- 7. Mẫu mẫu Chức năng C++
- 8. Tách chức năng cho MFC Cstring Class
- 9. Sử dụng một đối số để khấu trừ tham số mẫu?
- 10. C++ - Namespace vs Chức năng tĩnh
- 11. C++ Mẫu Chức năng biến thể của loại đã biết
- 12. Chức năng mẫu C++ cho mảng, vectơ, được xây dựng trong các loại, STL
- 13. Loại chức năng trong mẫu không biên dịch
- 14. Extracting C/C++ chức năng nguyên mẫu
- 15. Làm cách nào để sử dụng enable_if cho các mẫu chức năng không phải thành viên loại trừ lẫn nhau?
- 16. Làm chức năng mẫu tham số unsigned trong C++ 11
- 17. Vấn đề với std :: shared_ptr, thừa kế, và khấu trừ đối số mẫu
- 18. Đối số mẫu mặc định cho mẫu chức năng
- 19. Mã cho chức năng printf trong C
- 20. Mẫu chức năng thành viên C++ Mẫu variadic
- 21. C++ tăng chức năng quá tải mẫu
- 22. Chức năng gọi mẫu trong lớp mẫu
- 23. nguyên mẫu cho các chức năng 'tĩnh'
- 24. chức năng dụ Javascript so với chức năng nguyên mẫu
- 25. Chức năng mẫu is_same trong các lớp mẫu
- 26. Objective C Lớp Phương pháp vs Chức năng C
- 27. chức năng vs khai báo biến trong C++
- 28. Chức năng mẫu chuyên môn
- 29. mkdir C++ chức năng
- 30. Thông số mẫu chức năng không kiểu
Bạn có nói về 'std :: vector một (1, đúng); 'hoặc về' std :: vector v = std :: vector (1, đúng); '? Việc đầu tiên sẽ được khấu trừ "đúng", trong khi thứ hai sẽ yêu cầu một đối số đã biết. Lưu ý sự phức tạp của chuyên môn rõ ràng bool-vector. –
Việc đầu tiên, khấu trừ đúng, là không thể? – yesraaj
Tôi chỉ tìm thấy Bjarne Stroustrups lý do không bao gồm điều này bằng ngôn ngữ. –