2013-10-27 15 views
7

Nếu tôi có khai báo kiểu nhưC++ template tiếng gọi của chức năng con trỏ kiểu

typedef void (*command)(); 

template <command c> 
void execute() { 
    c(); 
} 

void task() { /* some piece of code */ } 

sau đó

execute<task>(); 

sẽ biên dịch và hoạt động như mong đợi. Tuy nhiên, nếu tôi xác định mẫu là

template <command c> 
void execute() { 
    command(); 
} 

nó vẫn biên dịch. Tôi đã làm điều này một cách tình cờ. Bây giờ tôi đang bối rối về những gì phiên bản thứ hai sẽ được dự kiến ​​sẽ làm.

+2

'command();' tạo đối tượng tạm thời của hàm * pointer * type được định nghĩa bởi 'typedef'. – Nawaz

+2

Có gì sai khi gọi 'execute (command)' ;? Tại sao bạn muốn sử dụng một mẫu lai như vậy? –

+0

Đây là một ví dụ bị tước. Điều tôi thực sự làm là ở đây: http://stackoverflow.com/a/19611077/2036917 Vấn đề là template cho phép tôi có các biến tĩnh khác nhau. Tôi biết rằng tôi có thể đạt được điều tương tự với các vật thể phù hợp. Nhưng sau đó một lần nữa nhớ rằng một Arduino chỉ có 2K RAM. Vì vậy, phương pháp tiếp cận làm giảm lượng bộ nhớ một chút. –

Trả lời

8

Trong C++

type_name() 

là một biểu hiện mà tạo ra một trường hợp mặc định khởi tạo của type_name.

Đối với người bản xứ loại có được ngầm định nghĩa constructor mặc định, ví dụ như vậy

int(); 

là C++ tuyên bố hợp lệ (chỉ cần tạo ra một int và ném nó đi).

g++ với cảnh báo đầy đủ khi phát ra thông báo chẩn đoán vì đó là hoạt động nghi ngờ (có thể không mong muốn), nhưng mã hợp lệ và thậm chí có thể có chương trình tùy thuộc vào nó (nếu loại là loại do người dùng xác định và hàm tạo của trường hợp có tác dụng phụ).

+1

Điều đó nghe đúng: ghi 'lệnh temp = command();' cũng biên dịch và gán cho 'temp' giá trị 0 – memo1288

+1

@ memo1288: Có ... và đối với các kiểu gốc, nó khác với' lệnh temp; '(điều đó không có t âm thanh quá đúng) – 6502

4
command(); 

Nó tạo ra một đối tượng tạm thời như TYPE(); và trình biên dịch bỏ qua nó như một không sử dụng biến .

warning: statement has no effect [-Wunused-value] 
    command(); 
    ^

Bạn nên bật tùy chọn -Wall trình biên dịch. Live code.

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