2016-05-22 20 views
6

Tôi muốn có tham số mẫu chấp nhận mẫu có đối số mẫu số.Làm cách nào để tham số mẫu mẫu có giá trị số?

Ví dụ này có lẽ quá đơn giản, nhưng tôi muốn một cái gì đó như thế này:

template <int X> 
struct XX 
{ 
    static const int x = X; 
}; 

template<typename TT, TT V, template<V> TX> 
void fnx(TX<V> x) 
{ 
    static_assert(V == TX::x, "IMPOSSIBLE!"); 
} 

void fny() 
{ 
    fnx(XX<1>()) 
} 

tôi không được hiểu cú pháp cho điều này, vì nó phải thực hiện được. Làm thế nào tôi sẽ thực hiện được điều này?

+2

gì đang 'TT' nghĩa vụ phải được? làm thế nào trình biên dịch sẽ suy ra loại của nó khi gọi 'fnx' trong' fny'? bạn có thể cung cấp thêm ngữ cảnh về vấn đề của mình mà bạn đang cố gắng giải quyết bằng cách tiếp cận này không? –

+0

@ m.s. 'int', có lẽ là. – Barry

+0

Cú pháp bạn cần 'mẫu lớp TX'. Nhưng đó không phải là toàn bộ vấn đề. –

Trả lời

6

Chỉ cần sửa chữa lên cú pháp của bạn một chút - kể từ khi tham số template mẫu được xác nhận sai, chúng tôi sẽ kết thúc với một cái gì đó như thế này:

template <typename T, template <T > class Z, T Value> 
//     ^^^^^^^^^^^^^^^^^^^^^ 
void foo(Z<Value> x) { } 

Tuy nhiên, trình biên dịch không thể suy T đây - đó là một bối cảnh không suy luận. Bạn phải cung cấp rõ ràng:

foo<int>(XX<1>{}); 

Điều đó khá khó chịu. Tôi thậm chí không thể viết một đặc điểm kiểu như vậy mà non_type_t<XX<1>>int (trong đó đặc tính kiểu đó thực sự nhìn vào loại thực tế, chứ không phải một cái gì đó tầm thường trả về int).


Có một đề nghị để cải thiện quá trình này (P0127) bằng cách sửa đổi không suy luận bối cảnh-Ness của phi kiểu mẫu đối số.

+0

Có vẻ như đề xuất 'template ', bỏ phiếu cho Oulu. – chris

+0

@chris Yep, đã tìm thấy nó. – Barry

+0

Ah, vâng. Kiểu tham số là một kiểu, không phải là một giá trị. Cảm ơn. Quá xấu về thất bại tự động khấu trừ mặc dù. :( – Adrian

2

Tuyên bố của bạn về fnx cần một số công việc và loại TT không thể được suy luận tại trang web cuộc gọi.

template<typename TT, TT V, template<TT> class TX> 
void fnx(TX<V> x) 
{ 
    static_assert(V == TX<V>::x, "IMPOSSIBLE!"); 
} 

void fny() 
{ 
    fnx<int>(XX<1>()); 
} 

dụ làm việc: https://ideone.com/57PsCA

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