2013-04-18 33 views
5

Mã của tôi là:thông số mẫu không phải kiểu dữ liệu, chuyên môn hóa được tạo ra?

#include <iostream> 

using namespace std; 


template <typename T, int X> 

class Test 
{ 
    private: 
    T container[X]; 
    public: 
    void printSize(); 

}; 
template <typename T, int X> 
void Test<T,X>::printSize() 
{ 
    cout <<"Container Size = "<<X <<endl; 
} 


int main() 
{ 
    cout << "Hello World!" << endl; 
    Test<int, 20> t; 
    Test<int, 30> t1; 

    t.printSize(); 
    t1.printSize(); 
    return 0; 
} 

Câu hỏi:

  1. bao nhiêu chuyên môn hóa sẽ được tạo ?. Nếu tôi hiểu chính xác, nó sẽ tạo hai chuyên môn cho <int, 20> và một chuyên gia khác là dành cho <int, 30>. Vui lòng chính xác nếu sự hiểu biết của tôi là sai?
  2. Có cách nào để xem/kiểm tra số lượng chuyên môn được tạo ra bởi bất kỳ kỹ thuật đảo ngược nào không?
+1

này có thể giúp http://stackoverflow.com/questions/4448094/can-we-see-the-template-instantiated-code-by-c-compiler – FireAphis

+0

@FireAphis, nhờ các liên kết. – Whoami

Trả lời

2

1) có, hai instantiations sẽ được tạo ra bởi các biên dịch, nhưng mối liên kết có thể kết hợp chức năng với mã được tạo giống hệt nhau (sử dụng toàn bộ ví dụ như tối ưu hóa chương trình), đó là một cách dễ thương để giảm sưng lên code .

2) xem điều này question nơi giải thích cách gcc có thể tạo đầu ra instantiation mẫu.

3

Không có chuyên môn tại đây, chỉ instantiations (this questions giải thích sự khác biệt). Mã này tạo ra hai instantiations của mẫu lớp Test.

+0

Tôi nghĩ rằng khi nói chuyên môn, ông có nghĩa là tạo ra các lớp học. tôi thực sự không hiểu tại sao hai (lớp) được tạo ra, nếu nó vẫn là một int trong cả hai lần. – Infested

+0

@Infested giá trị của 'X' khác – TemplateRex

+0

@rhalbersma ive nhận thấy rằng, nhưng nó vẫn là một int. làm thế nào tôi sẽ viết nó để phần "X" không tạo sự khác biệt? – Infested

0

1) Có bao nhiêu chuyên môn sẽ được tạo ?. Nếu tôi hiểu được chính xác, nó sẽ tạo hai chuyên môn cho một và cách khác là dành cho. Vui lòng chính xác nếu sự hiểu biết của tôi là sai?

Có, có hai.

2) Có cách nào để xem/kiểm tra số lượng chuyên môn được tạo bởi bất kỳ kỹ thuật đảo ngược nào không?

Nếu bạn có mã, bạn không cần kỹ thuật đảo ngược. Nếu bạn không có nó, bạn không thể tìm thấy nó với mã được tạo ra, bởi vì nó là thời gian biên dịch.

0

a) Có 2 trường hợp chuyên môn được tạo trong ví dụ của bạn.

b) Không có phương thức nội trang để hỗ trợ số lượng chuyên môn được tạo cho lớp học. Nếu dự án của bạn, bạn có thể thêm số đếm tĩnh. Nếu bạn muốn, bạn có thể viết cơ chế tính tham chiếu của riêng mình cho lớp học của bạn. Tăng số lượng tĩnh trong hàm tạo của chúng tôi.

static int created = 0; 
static int alive = 0; 
class Test 
{ 
counter() 
    { 
     created++; 
     alive++; 
    } 
~counter() 
{ 
    created--; 
} 
//Rest of class 
}; 
+0

Số lượt truy cập của bạn sẽ đếm số lượng phiên bản của lớp, chứ không phải số lần hiển thị của mẫu. – Angew

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