2010-11-17 41 views
5

Có bản cập nhật nào trong tiêu chuẩn C++ 0x sắp tới về các tham số có tên trong các mẫu và/hoặc các hàm không? Ví dụ, tôi muốn để có thể viết những điều sau đây:Đã đặt tên? Các tham số trong các mẫu, hàm

đã được định nghĩa trước:

template<class T = int,class Policy_1, class Policy_2> 
class X 
{ 
}; 

sau đó trong chính:

X<Policy_2: NoReturn> x; 

này cùng với các chức năng; có:

void f(int arg_1 = 0, int arg_2 = 1, int arg_3 = 2) 
{ 
} 

sau đó trong chính:

f(arg_3: 55); 

Trả lời

9

Đối với các chức năng bạn có thể sử dụng Thông số được đặt tên Idiom (trong cả C++ 98 và C++ 0x).

Xem mục C++ FAQ 10.20 What is the "Named Parameter Idiom"?.

Đối với đối số mẫu, tôi nghĩ bạn có thể sử dụng ý tưởng gói, sử dụng loại "loại nhà cung cấp dịch vụ" theo loại của họ mã hóa đối số mẫu nào. Nó trở nên phức tạp. Bạn có thể kiểm tra thư viện Tham số Tăng cường để có các ý tưởng, nhưng về cơ bản, đối với các đối số mẫu, tôi không nghĩ rằng nó đáng để dành thời gian cho (chưa nói đến thực sự sử dụng) - đó là học thuật.

Cheers & h.,

+0

+1 vì không nói sai là không thể: p –

+1

Tôi đã tìm thấy rất nhiều sử dụng cho nó mặc dù. Khi làm việc với thiết kế dựa trên chính sách, nơi có thể có từ 10 tham số mẫu trở lên, nó rất hữu ích. Boost.Parameter tạo ra mã thực thi lộn xộn, nhưng sạch sẽ và dễ sử dụng giao diện. –

+0

@Noah: MPL là đủ cho điều này (kết hợp với ý tưởng tàu sân bay loại). Một giải pháp khác mà tôi đã tìm thấy đơn giản là yêu cầu một kiểu 'thẻ' bên trong được định nghĩa trong mỗi chính sách xác định danh mục nào thuộc về nó.Cả hai đều tương đối gầy. –

0

Không, đó không phải đi làm việc trong C++ 0x.

8

Không với cú pháp đó và mặc dù việc sử dụng các cấu trúc như vậy trở nên dễ dàng hơn, việc tạo chúng khá lộn xộn.

Xem Boost.Parameter

Bạn kết thúc với

typedef template_by_named< policy1<type1>, policy2<type2> > x; 

f(param_b = 23, param_d = 42) 
+3

Đôi khi tôi tự hỏi, nếu có bất cứ điều gì Dave Abrahams không thể viết bằng C++ ... –

-4

Phần còn lại của chúng tôi chỉ sử dụng cấu trúc luận và đã vượt qua nó. Và không.

+8

-1 pointlessly đáng ghét và vô ích. –

+1

+1, hợp lý ngắn gọn và trung thực. – MSN

+0

Tôi sẽ chỉ ra http://www.boost.org/doc/libs/1_44_0/libs/parameter/doc/html/index.html – KitsuneYMG

0

This article mô tả một kỹ thuật có thể được sử dụng để mô phỏng tên thông số mẫu.

Ví dụ cú pháp:

enum class bars { bar1, bar2, bar3 }; 

// Omitted definitions of get_value, is_present, get_type, a, b, c and d. 

template <typename... Args> 
struct foo { 
    static constexpr auto A = get_value<a<1>, Args...>::value; 
    static constexpr auto B = get_value<b<bars::bar2>, Args...>::value; 
    static constexpr auto C = is_present<c, Args...>::value; 

    using D = typename get_type<d<char>, Args...>::value; 
}; 

// Client code 
foo<d<float>, a<42>> f; 
// f::A equals to 42; 
// f::B equals to defaulted bars::bar2; 
// f::C equals to false, because c is not present among temlate arguments; 
// f::D equals to float 
Các vấn đề liên quan