2012-02-24 33 views
10

Hãy asssume rằng chúng ta có một mẫu funcion:Có thể chuyển mẫu chức năng dưới dạng đối số mẫu không?

template<typename T1, typename T2, typename T3> 
T3 such_fun(T1 a, T2 b) { 
    // do something... 
} 

và bây giờ chúng tôi muốn sử dụng nó như một cuộc tranh cãi trong mẫu khác, ví dụ như thế

template<typename T1, template<typename, typename, typename> some_function> 
void big_fun(T1 a) { 
    // some code... 
    a = some_function<T1, T1, T1>(a, a); 
    // some code... 
} 

Có thể không?

Tôi biết rằng tôi có thể sử dụng cấu trúc với toán tử được định nghĩa(). Tôi chỉ tò mò về các chức năng.

EDIT:

Trong khi tôi đang viết rằng câu hỏi của bạn tôi tìm thấy một giải pháp phần:

template<typename T1, T1 (*some_function)(T1, T1)> 
void big_fun(T1 a) { 
    // some code... 
    a = some_function(a, a); 
    // some code... 
} 

Nhưng vẫn - Tôi tò mò nếu nó có thể không có thể hóa của một loại chức năng trước gọi điện. Ví dụ - tôi có thể muốn gọi mẫu được truyền với các loại kết hợp khác nhau:

template<typename T1, typename T2, template<typename, typename, typename> some_function> 
void big_fun(T1 a, T2 b) { 
    // some code... 
    a = some_function<T1, T1, T1>(a, a); 
    a = some_function<T1, T2, T1>(a, b); 
    b = some_function<T2, T2, T2>(b, b); 
    b = some_function<T2, T1, T2>(b, a); 
    // some code... 
} 

Trả lời

8

Không, điều này là không thể. Từ 14.3.3 trong N3337:

Mẫu đối số cho một mẫu template-tham số sẽ là tên của một lớp mẫu hay một mẫu bí danh, đã bày tỏ như id thể hiện. Khi đối số mẫu đặt tên mẫu lớp, chỉ các mẫu lớp chính mới được xem xét khi đối chiếu mẫu đối số mẫu với thông số tương ứng; một phần chuyên môn không được xem xét ngay cả khi danh sách tham số của chúng khớp với thông số của thông số mẫu mẫu.

Đoạn đầu tiên chỉ đề cập đến các mẫu lớp một cách rõ ràng. Tôi đoán nó cũng không thực sự đáng giá cho rắc rối mà bạn có thể làm một cái gì đó rất giống với chức năng hoặc một số std::function như một đối số.

+1

Tôi không hiểu lời bạn đang nói .. -1, bạn có thể cung cấp thông tin cho chúng tôi không thông thạo trong chế độ standarese không? – lurscher

+0

@lurscher vì _you_ không hiểu đó là lý do khủng khiếp để giảm giá. Tôi không downvote các nhà vật lý lượng tử khi họ nói về vật lý lượng tử bởi vì tôi không hiểu nó. –

+0

@SethCarnegie, tôi không đồng ý. Tôi nghĩ đó là một lý do rất tốt. bên cạnh đó, câu trả lời cũng sai; những gì câu hỏi muốn làm là hoàn toàn có thể, ngay cả trong C++ 03.Tôi nghĩ rằng có một ngắt kết nối giữa những gì SO hỏi và những gì pmr câu trả lời, do đó các downvote. Nếu anh ấy cải thiện câu trả lời của mình, tôi sẽ rất vui khi rút nó – lurscher

1

Mẫu trong C++ được biên dịch trong thời gian biên dịch bằng cách sử dụng các loại cụ thể. Họ phải được biết đến.

Điều này cho biết bạn có thể tiến xa hơn một chút với giải pháp từng phần của bạn bằng cách chuyển một mẫu chức năng mà các đối số có thể được suy luận. Lưu ý rằng điều này là không khác nhau sau đó rõ ràng đi qua chức năng với các loại bê tông bạn chỉ cần gõ ít hơn.

template<typename T> 
T square(T a, T b) 
{ 
    return a * b; 
} 

template<typename T, T (*some_function)(T, T)> 
T test(T a) 
{ 
    return square (a, a); 
} 

void main() 
{ 
    int a = test<int, square>(2); 
    float b = test<float, square>(2.2f); 
} 
+0

Tôi không thực sự thấy sự khác biệt giữa mã đó và mã "giải pháp một phần". Vấn đề là trong phương pháp này, không thể sử dụng 'some_function' với các kiểu khác nhau mà không cần thêm một đối số mẫu mới. Và tôi tò mò nếu có một cách linh hoạt hơn (nhưng vẫn không có cách sử dụng lớp). –

0

Miễn là template< typename T1, typename T2, typename T3> someTemplate đánh giá một số lớp thực tế không có lỗi, bạn có thể sử dụng với nhiều kết hợp như bạn muốn, trong và ngoài các mẫu khác.

Bạn đã cố gắng biên dịch nó chưa? Hiển thị cho chúng tôi lỗi nào (và mẫu cụ thể)

+0

Tôi biết rằng tôi có thể sử dụng một lớp học. Tôi đã viết rằng trong bài viết của tôi. Câu hỏi đặt ra là về các chức năng chung. Nhưng theo những gì @pmr đã viết - có vẻ như cú pháp không thể. –

+1

Cú pháp sử dụng OP (và bằng cách mở rộng bạn) không hợp lệ. Giá trị đúng là 'mẫu lớp someTemplate'. Cũng không có gì ở đây là về 'đánh giá'. Hãy tưởng tượng theo cách này: một đối số mẫu khuôn mẫu chỉ có thể được khớp với tên của một mẫu lớp có cùng một danh sách tham số mẫu (điều này quan trọng đối với các đối số mẫu không phải kiểu). Tên mẫu này sau đó được tiêm vào khuôn mẫu khác và có thể được khởi tạo ở đó. Vấn đề là 'lớp mẫu'. Tôi không thấy lý do cụ thể nào cho sự hạn chế này, nhưng tôi không thuộc về ủy ban và cũng không có luật sư ngôn ngữ. – pmr

+0

@pmr Uhm. Tốt. Cú pháp tôi đã sử dụng trong một ví dụ là một phần mã giả, tức là tôi biết rằng tôi không thể sử dụng từ khóa 'lớp' để tôi không sử dụng bất kỳ từ khóa nào. Đó là về ý tưởng. –

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