Một giải pháp thay thế được cung cấp bởi bộ thư viện chuẩn là:
std::array<B, some_constant_value>
arr((std::copy(init.begin(),init.end(),(&arr)->begin()),arr));
Lưu ý rằng đối số của các nhà xây dựng được đính kèm bởi ((...))
, sao cho nó được phân tích cú pháp chính xác dưới dạng biểu thức dấu phẩy thay vì hai đối số.
Giải pháp này dựa trên thực tế là B
được xây dựng hoàn toàn từ A
. Một giải pháp ngắn đó cũng sẽ có tác dụng nếu các nhà xây dựng chuyển đổi được làm rõ là:
auto lamb =
[&init]() -> B { static size_t i = 0; return B(init[i++]); };
std::array<B, some_constant_value>
arr((std::generate((&arr)->begin(),(&arr)->end(),lamb),arr));
Các chương trình thử nghiệm sau đây, được xây dựng với GCC 4.7.2, Clang 3.2 và Intel C++ 13.1.1, (tùy chọn -g -O0 -Wall -std=c++11
) minh họa cả hai giải pháp:
#include <iostream>
#include <array>
#include <algorithm>
struct A
{
int _i = 42;
};
struct B
{
B(A x)
: _i(x._i){}
int _i;
};
struct C
{
explicit C(A x)
: _i(x._i){}
int _i;
};
using namespace std;
int main()
{
array<A, 10> init;
array<B, 10> arr((copy(init.begin(),init.end(),(&arr)->begin()),arr));
cout << "arr contains..." << endl;
for (size_t i = 0; i < arr.size(); ++i) {
cout << arr[i]._i << endl;
}
auto lamb =
[&init]() -> C { static size_t i = 0; return C(init[i++]); };
array<C, 10> brr((generate((&brr)->begin(),(&brr)->end(),lamb),brr));
cout << "brr contains..." << endl;
for (size_t i = 0; i < brr.size(); ++i) {
cout << brr[i]._i << endl;
}
return 0;
}
Nguồn
2013-04-29 09:04:38
Bạn có cần * khởi tạo hoặc bạn có thể thực hiện tuyến đường dễ dàng và thực hiện chuyển nhượng không? – Pubby
@Pubby Tôi không thể thực hiện nhiệm vụ vì B sẽ không xây dựng mà không có đối số, thật không may. – Svalorzen