Bạn có thể sử dụng C++ 0xauto
từ khóa cùng với chuyên môn mẫu ví dụ: một hàm có tên boost::make_array()
(tương tự make_pair()
). Đối với trường hợp nơi N
là 1 hoặc 2 đối số thì chúng ta có thể viết biến Một như
namespace boost
{
/*! Construct Array from @p a. */
template <typename T>
boost::array<T,1> make_array(const T & a)
{
return boost::array<T,2> ({{ a }});
}
/*! Construct Array from @p a, @p b. */
template <typename T>
boost::array<T,2> make_array(const T & a, const T & b)
{
return boost::array<T,2> ({{ a, b }});
}
}
và biến thể B như
namespace boost {
/*! Construct Array from @p a. */
template <typename T>
boost::array<T,1> make_array(const T & a)
{
boost::array<T,1> x;
x[0] = a;
return x;
}
/*! Construct Array from @p a, @p b. */
template <typename T>
boost::array<T,2> make_array(const T & a, const T & b)
{
boost::array<T,2> x;
x[0] = a;
x[1] = b;
return x;
}
}
GCC-4.6 với -std=gnu++0x
và -O3
tạo ra mã nhị phân chính xác giống nhau cho
auto x = boost::make_array(1,2);
sử dụng cả hai Một và B vì nó làm cho
boost::array<int, 2> x = {{1,2}};
Đối người dùng định nghĩa loại (UDT), tuy nhiên, kết quả biến thể B trong một bản sao constructor thêm, mà thường làm chậm mọi thứ, và do đó nên tránh.
Lưu ý rằng boost::make_array
lỗi khi gọi nó với chữ rõ ràng char mảng như trong trường hợp sau đây
auto x = boost::make_array("a","b");
Tôi tin rằng đây là một điều tốt vì const char*
literals có thể lừa đảo trong việc sử dụng chúng.
variadic mẫu, có sẵn trong GCC kể từ 4.5, hơn nữa có thể được sử dụng làm giảm tất cả các mẫu chuyên môn đang nồi hơi-tấm cho mỗi N
thành một đơn mẫu định nghĩa của boost::make_array()
định nghĩa là
/*! Construct Array from @p a, @p b. */
template <typename T, typename ... R>
boost::array<T,1+sizeof...(R)> make_array(T a, const R & ... b)
{
return boost::array<T,1+sizeof...(R)>({{ a, b... }});
}
Điều này hoạt động khá nhiều như chúng ta mong đợi. Đối số đầu tiên xác định boost::array
đối số mẫu T
và tất cả đối số khác được chuyển đổi thành T
. Đối với một số trường hợp, điều này có thể không mong muốn, nhưng tôi không chắc làm thế nào nếu điều này có thể chỉ định bằng cách sử dụng các mẫu variadic.
Có lẽ boost::make_array()
nên đi vào Thư viện nâng cao?
lớp của bạn không constructible vì tất cả mọi thứ là 'private'. –
(truy cập từ khóa còn lại để đơn giản sư phạm) –
Sẽ không dễ dàng hơn khi sử dụng 'struct' thay cho' lớp' để đơn giản sư phạm? Tôi tìm thấy mã mà biên dịch dễ dàng hơn để tìm hiểu từ ;-) –