2009-03-03 40 views
8

Giả sử tôi có một tập hợp các hàm và lớp được lập biểu để sử dụng độ chính xác đơn (float) hoặc double. Tất nhiên tôi có thể viết chỉ hai phần mã khởi động, hoặc lộn xộn với các macro. Nhưng tôi có thể chỉ chuyển đối số mẫu tại thời gian chạy không?Chọn đối số mẫu tại thời gian chạy trong C++

Trả lời

19

Không, bạn không thể chuyển đổi đối số mẫu khi chạy, vì các mẫu được trình biên dịch khởi tạo tại thời gian biên dịch. Những gì bạn thể làm là có cả các mẫu lấy được từ một lớp cơ sở chung, luôn luôn sử dụng các lớp cơ sở trong mã của bạn, và sau đó quyết định có nguồn gốc lớp để sử dụng trong thời gian chạy:

class Base 
{ 
    ... 
}; 

template <typename T> 
class Foo : public Base 
{ 
    ... 
}; 

Base *newBase() 
{ 
    if(some condition) 
     return new Foo<float>(); 
    else 
     return new Foo<double>(); 
} 

Macros có cùng một vấn đề như mẫu, trong đó chúng được mở rộng tại thời gian biên dịch.

3

Mẫu là cơ chế biên dịch. BTW, macro cũng là (nói đúng - một cơ chế tiền xử lý - thậm chí trước khi biên dịch).

2

Mẫu hoàn toàn là cấu trúc thời gian biên dịch, trình biên dịch sẽ mở rộng mẫu và tạo lớp/chức năng của bạn với đối số được chỉ định và dịch trực tiếp mã đó.

Nếu bạn đang cố gắng chuyển đổi giữa foo<float>foo<double> khi chạy, bạn sẽ cần phải sử dụng một số thủ thuật lập trình meta hoặc chỉ có đường dẫn mã riêng biệt cho mỗi.

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