2009-12-17 36 views
14

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?

+0

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. –

+0

Việc đầu tiên, khấu trừ đúng, là không thể? – yesraaj

+0

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ữ. –

Trả lời

17

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 ...

+0

Đó là những gì tôi hỏi tại sao bạn cần bọc một lớp bên trong một hàm, giống như chúng làm trong boost :: bind – yesraaj

+1

Tính linh hoạt được cung cấp bởi một số nhà xây dựng không ít hơn hoặc nhiều hơn sự linh hoạt do nhiều quá tải. – Puppy

1

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.

+9

-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ứ. –

+0

+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. –

+0

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

4

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.

+0

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ợ. –

+0

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. –

+0

Tôi nghĩ anh ấy hỏi * tại sao * không thể, không * cho dù * có thể. –

9

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}); 
Các vấn đề liên quan