2011-09-22 5 views
5

Để minh họa:Có cách nào để chuyển đối số mẫu cho một hàm trên một đối tượng khi kiểu đối tượng là đối số mẫu không?

struct MyFunc { 

    template <size_t N> 
    void doIt() { 
     cout << N << endl; 
    } 

}; 

template <typename Func> 
struct Pass123ToTemplateFunc { 

    static void pass(Func f) { 
     f.doIt<123>(); // <-- Error on compile; is there a way to express this? 
    } 

}; 

int main() { 

    Pass123ToTemplateFunc<MyFunc>::pass(MyFunc()); 

    return 0; 

} 

này là khá nhiều hoàn toàn là một sự tò mò cú pháp; là có một cách trong ngôn ngữ để thể hiện điều này mà không cần vượt qua các đối số với chính hàm doIt? Nếu không, nó không phải là vấn đề lớn và tôi đã nhận thức rõ về cách tôi có thể làm việc một cách duyên dáng xung quanh nó, vì vậy không cần phải cung cấp các giải pháp thay thế. (Tôi sẽ chấp nhận "không" như một câu trả lời, hay nói cách khác, nếu đó là sự thật :-P.)

Trả lời

8

Bạn phải nói với trình biên dịch rằng doIt sẽ là một mẫu:

f.template doIt<123>(); 
+1

Thật khó tin bao nhiêu lần việc sử dụng từ khóa đó lẻn vào tôi. Cảm ơn! – nonoitall

+0

@nonoitall: Để biết thêm thông tin, hãy xem Câu hỏi thường gặp này: [Cú pháp '-> mẫu',' .template' và ':: template' là gì?] (Http://www.comeaucomputing.com/techtalk/templates/# templateprefix) – ildjarn