- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我发现了两个相关的提交:
The previous __make_tuple_indices implementation caused O(N) instantiations and was pretty inefficient. The C++14 __make_integer_sequence implementation is much better, since it either uses a builtin to generate the sequence or a very nice Log8(N) implementation provided by richard smith.
This patch moves the __make_integer_sequence implementation into __tuple and uses it to implement __make_tuple_indices.
Since libc++ can't expose the name 'integer_sequence' in C++11 this patch also introduces a dummy type '__integer_sequence' which is used when generating the sequence. One the sequence is generated '__integer_sequence' can be converted into the required type; either '__tuple_indices' or 'integer_sequence'.
从提交中,我知道它是一个 Log8(N) 实现,它手动展开循环(如果不正确,请纠正我,thx)。但我无法理解 namespace detail
Và __integer_sequence 一起工作.我曾尝试使用调试器,但它始终使用 __has_builtin(__make_integer_seq) branch .
所以,请帮助我理解这个实现,主要代码在this commitVà this part of
:
//
template using __make_integer_sequence_unchecked =
typename __detail::__make<_Np>::type::template __convert;
template
struct __make_integer_sequence_checked
{
static_assert(is_integral<_Tp>::value,
"std::make_integer_sequence can only be instantiated with an integral type" );
static_assert(0 <= _Ep, "std::make_integer_sequence must have a non-negative sequence length");
// Workaround GCC bug by preventing bad installations when 0 <= _Ep
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68929
typedef __make_integer_sequence_unchecked<_Tp, 0 <= _Ep ? _Ep : 0> type;
};
template
using __make_integer_sequence = typename __make_integer_sequence_checked<_Tp, _Ep>::type;
// <__tuple>
template
struct __integer_sequence {
template class _ToIndexSeq, class _ToIndexType>
using __convert = _ToIndexSeq<_ToIndexType, _Values...>;
template
using __to_tuple_indices = __tuple_indices<(_Values + _Sp)...>;
};
template struct __repeat;
template struct __repeat<__integer_sequence<_Tp, _Np...>, _Extra...> {
typedef __integer_sequence<_Tp,
_Np...,
sizeof...(_Np) + _Np...,
2 * sizeof...(_Np) + _Np...,
3 * sizeof...(_Np) + _Np...,
4 * sizeof...(_Np) + _Np...,
5 * sizeof...(_Np) + _Np...,
6 * sizeof...(_Np) + _Np...,
7 * sizeof...(_Np) + _Np...,
_Extra...> type;
};
template struct __parity;
template struct __make : __parity<_Np % 8>::template __pmake<_Np> {};
template<> struct __make<0> { typedef __integer_sequence type; };
template<> struct __make<1> { typedef __integer_sequence type; };
template<> struct __make<2> { typedef __integer_sequence type; };
template<> struct __make<3> { typedef __integer_sequence type; };
template<> struct __make<4> { typedef __integer_sequence type; };
template<> struct __make<5> { typedef __integer_sequence type; };
template<> struct __make<6> { typedef __integer_sequence type; };
template<> struct __make<7> { typedef __integer_sequence type; };
template<> struct __parity<0> { template struct __pmake : __repeat::type> {}; };
template<> struct __parity<1> { template struct __pmake : __repeat::type, _Np - 1> {}; };
template<> struct __parity<2> { template struct __pmake : __repeat::type, _Np - 2, _Np - 1> {}; };
template<> struct __parity<3> { template struct __pmake : __repeat::type, _Np - 3, _Np - 2, _Np - 1> {}; };
template<> struct __parity<4> { template struct __pmake : __repeat::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
template<> struct __parity<5> { template struct __pmake : __repeat::type, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
template<> struct __parity<6> { template struct __pmake : __repeat::type, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
template<> struct __parity<7> { template struct __pmake : __repeat::type, _Np - 7, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
} // namespace detail
Cảm ơn trước.
如果您认为这个问题太边界/粗鲁,请随时告诉我。我会尽快删除,虽然这个问题确实很困扰我。
câu trả lời hay nhất
你还需要了解__repeat
看看这是如何工作的:
template struct __repeat;
template struct __repeat, _Extra...> {
typedef integer_sequence<_Tp,
_Np...,
sizeof...(_Np) + _Np...,
2 * sizeof...(_Np) + _Np...,
3 * sizeof...(_Np) + _Np...,
4 * sizeof...(_Np) + _Np...,
5 * sizeof...(_Np) + _Np...,
6 * sizeof...(_Np) + _Np...,
7 * sizeof...(_Np) + _Np...,
_Extra...> type;
}
它需要两个模板参数:一个整数序列和一个参数包 _Extra
值(value)观。
它有一个成员 typedef kiểu
是与初始整数序列类型相同的整数序列。
它的成员如下:
_Np..., // The original values
sizeof...(_Np) + _Np...,
// sizeof...(_Np) is the number of integers in the sequence. This is a fold expression
// that adds the sizeof...(_Np) to every integer.
// So (_Np..., sizeof...(_Np) + _Np...) for <0, 1, 2> would be
// (<0, 1, 2>..., <3 + 0, 3 + 1, 3 + 2>...), which is `<0, 1, 2, 3, 4, 5>`.
// The rest of the lines are the same, but starting with a different
// multiple of sizeof...(_Np)
// `<0, 1, ..., N>` into an integer sequence of `<0, 1, ..., 8N>`.
_Extra...
// And then add `_Extra` to the end
__make<_Np>
từ _Np = 0
至 _Np = 7
是硬编码的。否则,它使用 __parity
作为辅助类型。
这将使用 __repeat
重复 __make<_Np / 8>
8 次,创建所需的长度,然后根据它比最后一个 8 的倍数(此处称为“奇偶校验”)大多少来使用额外的项添加为 _Extra
.
与其说是“手动展开循环”,倒不如说是“手动展开循环”。就是递归除make_integer_sequence
Đi vàorepeat_8_times<>
,所以它是“基于基本情况的递归”
关于c++ - 如何理解libcxx对make_integer_sequence的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53350706/
#include sử dụng không gian tên std; lớp C{ riêng tư: int giá trị; công khai: C(){ giá trị = 0;
Câu hỏi này đã có câu trả lời: Sự khác biệt giữa char a[] = ?string?; và char *p = ?string?;? (8 câu trả lời) Đã đóng
đóng cửa. Câu hỏi này yêu cầu chi tiết hoặc rõ ràng. Câu trả lời không được chấp nhận vào thời điểm này. Bạn muốn cải thiện câu hỏi này? Thêm chi tiết và làm rõ câu hỏi bằng cách chỉnh sửa bài đăng này Đã đóng 7 năm trước. Bài đăng này đã được 8 tháng rồi
Ngoài việc gỡ lỗi, có công cụ kiểm tra nào cho c, c++ hoặc c# hoạt động giống như các hàm độc lập dán sao chép vào một số hộp văn bản rồi nhập tham số vào các hộp văn bản khác không? Câu trả lời hay nhất Có lẽ bạn sẽ xem xét thử nghiệm đơn vị. Tôi khuyên bạn nên kiểm tra google và google mô phỏng
Tôi muốn di chuyển một cửa sổ (HWND) trong màn hình thứ hai. Vấn đề là tôi đã thử rất nhiều cách như tăng gấp đôi độ phân giải hoặc nhập giá trị âm, nhưng nó không bao giờ đặt cửa sổ trên màn hình thứ hai của tôi. Mọi manh mối về cách thực hiện việc này trong C/C++/C# sẽ hữu ích nhất
Tôi đang tìm kiếm các triển khai hiện có của các loại DES khác nhau trong C/C++/C##. Nền tảng đang chạy của tôi là Windows XP/Vista/7. Tôi đang cố gắng viết chương trình C# sẽ sử dụng thuật toán DES để mã hóa và giải mã. Tôi cần một số thực tế
Thật khó để nói những gì để hỏi ở đây. Câu hỏi không rõ ràng, mơ hồ, không đầy đủ, quá rộng hoặc hùng biện và không thể trả lời hợp lý ở dạng hiện tại. Để được trợ giúp làm rõ vấn đề này để có thể mở lại, hãy truy cập trung tâm trợ giúp Đóng 1.
Có cách nào để buộc một cửa sổ khác ở trên cùng không? Không phải cửa sổ của ứng dụng mà là một cửa sổ khác đang chạy trên hệ thống. (Windows, C/C++/C#) Câu trả lời hay nhấtSetWindowPos(that_window_ha
Giả sử bạn có lựa chọn giữa C/C++ hoặc Csharp và bạn dự định chạy nhiều phiên bản của cùng một máy chủ trên máy chủ Windows và Linux, đâu là lựa chọn thông minh nhất để xây dựng một ứng dụng máy chủ socket? Câu trả lời tốt nhất là như
Bạn có thể cho tôi biết sự khác biệt giữa chúng? Nhân tiện, có thứ gì được gọi là thư viện C++ hay thư viện C không? Câu trả lời hay nhất Thư viện chuẩn C++ và thư viện chuẩn C là các thư viện được xác định theo tiêu chuẩn C++ và C và được cung cấp để các chương trình C++ và C sử dụng. Đó là điểm chung của những từ đó
Trong mã kiểm tra bên dưới, tôi đưa thông tin đầu ra vào phần bình luận. Tôi đang sử dụng gcc 4.8.5 và Centos 7.2. #include #include lớp C { công khai:
Thật khó để nói những gì đang được hỏi ở đây. Câu hỏi mơ hồ, mơ hồ, không đầy đủ, quá rộng hoặc hùng biện và không thể trả lời hợp lý ở dạng hiện tại. Để được trợ giúp làm rõ vấn đề này để bạn có thể mở lại, hãy truy cập trung tâm trợ giúp. Đã đóng
Khách hàng của tôi sẽ sử dụng cấu trúc/lớp được gọi là thông báo để liên lạc với khách hàng. Tôi nghĩ tôi sẽ viết máy chủ bằng C++. Sẽ có nhiều lớp khác nhau kế thừa thông báo. Vấn đề của tôi là gửi các lớp này qua mạng tới máy khách. Tôi nghĩ có lẽ tôi nên sử dụng
Tôi có hàm sau trong C#: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
Tôi có một dự án mà tôi phải viết một hàm để thực hiện một số thao tác nhất định trên một số dữ liệu. Tôi có thể viết mã bằng C/C++, nhưng tôi không muốn chia sẻ mã của chức năng này với chủ nhân của mình. Thay vào đó, tôi chỉ muốn anh ấy có quyền gọi hàm bằng mã của riêng mình. Có thể được không? Tôi đã nghĩ đến hai phương pháp này - trong
Tôi đang sử dụng API của bên thứ 3 (C/C++) được viết kém. Tôi đang sử dụng nó từ mã được quản lý (C++/CLI). Đôi khi xảy ra "Lỗi vi phạm quyền truy cập". Điều này làm hỏng toàn bộ ứng dụng. Tôi biết tôi không thể xử lý những lỗi này [nếu con trỏ truy cập vào vị trí bộ nhớ không hợp lệ, v.v.
đóng cửa. Câu hỏi này không tuân thủ các nguyên tắc của Stack Overflow. Hiện tại nó không chấp nhận câu trả lời. Chúng tôi không cho phép các câu hỏi tìm kiếm đề xuất về sách, công cụ, thư viện phần mềm, v.v. Bạn có thể chỉnh sửa câu hỏi của mình để trả lời bằng sự kiện và trích dẫn. Đóng cửa 7 năm trước
Đã đóng cửa. Câu hỏi này không tuân thủ nguyên tắc Stack Overflow. Câu trả lời không được chấp nhận vào thời điểm này. Các câu hỏi yêu cầu chúng tôi giới thiệu hoặc tìm các công cụ, thư viện hoặc tài nguyên bên ngoài trang web yêu thích đều không có chủ đề đối với Stack Overflow vì
Tôi có một số mã C sẽ được gọi từ C# bằng P/Invoke. Tôi đang cố gắng xác định tương đương C# cho hàm C này. SomeData* DoSomething(); struct SomeData {
Câu hỏi này đã có câu trả lời: Tại sao các cấu trúc này sử dụng hành vi không xác định trước và sau tăng? (14 câu trả lời) Đã đóng 6
Tôi là một lập trình viên xuất sắc, rất giỏi!