C ++ 17是2017年批准的C ++标准的名称。它基于以前的C ++ 14标准,改进了核心语言和标准库,并添加了一些新的语言功能。
我正在尝试验证字符串(string_view)是否是“允许的”组合之一。 字符串始终为 3 个 ASCII 字符 - 大写和小写 - A、B、C。这些是 3 个 elem 的排列...
通过 const 引用延长临时对象的生命周期是否也适用于临时容器的元素,例如下面程序中引用 r 的情况? 这是保证吗...
如何在 (cout << ... << args) using fold expressions?
鉴于 模板 无效打印(类型&& ...args){ (算<< ... << args); } // .... print(1, 2, 3, 4); // prints 1234 How to add spaces so we get 1 2 3 ...
C++ 相当于 Rust 的 Result<T, E> 类型?
我喜欢在我的 C++ 代码中使用 std::experimental::Optional,但问题是 value_or 要求默认值与可选值的类型相同。 当我...
JNI CallStaticObjectMethod 导致 Java 21 崩溃
我工作的公司最近从 Java 8 迁移到 Java 21,它还更新了 JNI 版本以及与 C++ 的互操作性。所有函数(用 C++ 编写)都是通过 JNI 调用的
任务: 在此任务中,您必须编写一个既像 C 中的常规数组又像 Python 中的列表一样工作的结构。即写一个结构体 模板 结构体FlexArray;
如何在 C++17 中对 std::conditional_t 使用 void
我尝试基于 std::conditional_t 类型定义类成员的 std::function 模板参数: 模板 类我的类{ static_assert( (N > 0), &quo...
共享互斥量和互斥量之间的区别(为什么两者都存在于C++ 17中)?
网上还没有例子来生动地演示这一点。在http://en.cppreference.com/w/cpp/header/shared_mutex看到了一个例子,但是 目前还不清楚。有人可以帮忙吗?
我有一个可变参数类模板中给出的参数包,想要提取第一个类型。 目前我这样做,效果很好,但有点麻烦。是否可以做同样的事情...
如何使用 std::reference_wrapper 将引用存储在 std::unordered_map 中?
我正在尝试学习 std::reference_wrapper 和 std::ref 的使用及其用例。 这是我编写的示例代码。请帮我解决编译错误。如果可以的话那就太好了
如何使用 std::reference_wrapper 将引用存储在 unordered_map 中?
我正在尝试学习 std::reference_wrapper 和 std::ref 的使用及其用例。 这是我编写的示例代码。请帮我解决编译错误。如果可以的话那就太好了
如何使用 std::reference_wrapper 将引用存储在 unordered_map 中?
我正在尝试学习 std::reference_wrapper 和 std::ref 的使用及其用例。 这是我写的示例代码,请帮我解决编译错误,如果你ex的话那就太好了...
考虑以下程序: #包括 #包括 #包括 #包括 模板 结构有序{}; 模板 考虑以下程序: #include <tuple> #include <vector> #include <iostream> #include <type_traits> template <class T> struct ordered {}; template <class... T> struct ordered<std::tuple<T...>> { using type = /* a reordered tuple */; }; template <class T> using ordered_t = typename ordered<T>::type; int main(int argc, char* argv[]) { using type1 = std::tuple<char, std::vector<int>, double>; using type2 = std::tuple<std::vector<int>, double, char>; std::cout << std::is_same_v<type1, type2> << "\n"; // 0 std::cout << std::is_same_v<ordered_t<type1>, ordered_t<type2>> << "\n"; // 1 return 0; } ordered 帮助器必须重新排序元组中的类型,这样两个具有相同类型但顺序不同的元组会产生相同的元组类型:可以是第一个、第二个,甚至另一个:它只需具有相同的大小和相同的元素,但顺序不同(无论这个顺序如何)。 是否可以使用模板元编程技术在编译时执行此操作? 困难的部分是想出一种订购类型的方法。按谓词对类型列表进行排序是一件苦差事,但也是可行的。我在这里只关注比较谓词。 一种方法是创建一个类模板,为每种类型定义唯一的 id。这很有效,并且可以轻松编写比较器: template <typename T, typename U> constexpr bool cmp() { return unique_id_v<T> < unique_id_v<U>; } 但是提出这些唯一的 ID 是一个不一定可行的障碍。您是否将它们全部注册在一个文件中?这并不能很好地扩展。 如果我们能够...获取所有类型的 names 作为编译时字符串,那就太好了。反思会给我们这个,然后这个问题就变得微不足道了。在那之前,我们可以做一些更肮脏的事情:使用__PRETTY_FUNCTION__。 gcc 和 clang 都可以在 constexpr 上下文中使用该宏,尽管它们对此字符串具有不同的格式。如果我们有这样的签名: template <typename T, typename U> constexpr bool cmp(); 然后 gcc 将 cmp<char, int> 报告为 "constexpr bool cmp() [with T = char; U = int]",而 clang 将其报告为 "bool cmp() [T = char, U = int]"。它是不同的......但足够接近,我们可以使用相同的算法。基本上是:找出 T 和 U 在那里,然后进行正常的字符串字典比较: constexpr size_t cstrlen(const char* p) { size_t len = 0; while (*p) { ++len; ++p; } return len; } template <typename T, typename U> constexpr bool cmp() { const char* pf = __PRETTY_FUNCTION__; const char* a = pf + #ifdef __clang__ cstrlen("bool cmp() [T = ") #else cstrlen("constexpr bool cmp() [with T = ") #endif ; const char* b = a + 1; #ifdef __clang__ while (*b != ',') ++b; #else while (*b != ';') ++b; #endif size_t a_len = b - a; b += cstrlen("; U = "); const char* end = b + 1; while (*end != ']') ++end; size_t b_len = end - b; for (size_t i = 0; i < std::min(a_len, b_len); ++i) { if (a[i] != b[i]) return a[i] < b[i]; } return a_len < b_len; } 一些测试: static_assert(cmp<char, int>()); static_assert(!cmp<int, char>()); static_assert(!cmp<int, int>()); static_assert(!cmp<char, char>()); static_assert(cmp<int, std::vector<int>>()); 这不是最漂亮的实现,我不确定它是否受到标准的有意义认可,但它可以让您编写排序,而无需手动且仔细地注册所有类型。它在 clang 和 gcc 上编译。所以也许这已经足够好了。 这是对 Barry 提出的方法的轻微修改,该方法适用于 Visual Studio。而不是创建存储函数名称的编译时字符串: template <typename T, typename U> constexpr bool cmp() 此方法直接比较 type_name< T>::name() 返回的两个类型的名称。当宏 __PRETTY_FUNCTION__ 返回的类型 T 和 U 的名称用逗号分隔时,Barry 的方法不起作用,因为当 T 或 U 是类或函数模板时,逗号也可以分隔模板参数。 // length of null-terminated string constexpr size_t cstrlen(const char* p) { size_t len = 0; while (*p) { ++len; ++p; } return len; } // constexpr string representing type name template<class T> struct type_name { static constexpr const char* name() { #if defined (_MSC_VER) return __FUNCSIG__; #else return __PRETTY_FUNCTION__; #endif }; }; // comparison of types based on type names template<class T1, class T2> constexpr bool less() { const char* A = type_name<T1>::name(); const char* B = type_name<T2>::name(); size_t a_len = cstrlen(A); size_t b_len = cstrlen(B); size_t ab_len = (a_len < b_len) ? a_len : b_len; for (size_t i = 0; i < ab_len; ++i) { if (A[i] != B[i]) return A[i] < B[i]; } return a_len < b_len; } // simple checks template<class ... Type> struct list; static_assert(less<list<int, void, list<void, int>>, list<int, void, list<void, void>>>()); static_assert(less<list<int, void, list<void, int>>, list<int, void, list<void, int>, int>>()); 此方法适用于VS。我不确定它是否适用于 Clang 或 GCC。 tl;dr:在编译时获取类型名称,并按该名称排序。 在我看来,之前的答案有点特殊——至少在实施方面是这样。 此时,我们有一个非常好的、支持多编译器的函数,用于获取类型名称作为编译时字符串和字符串视图。我在这里只引用它的签名: template <typename T> constexpr std::string_view type_name(); 这构成了从类型到编译时可比较值的单射映射。鉴于这些,您可以轻松实现类似“选择排序”的过程来获取每种类型的相对顺序。最后,您使用这些顺序组装一个新的元组。
我克隆了这个开源项目https://github.com/balfieri/cordic。按照 README 运行 $ g++ -std=c++17 -o test_basic test_basic.cpp 后遇到以下问题 $ g++ -std=c++17 -o test_b...
我有一个应用程序,可以在 QTableView 中显示文件的日期和时间以及文件路径。我使用以下代码获取文件的日期和时间并显示路径和日期和时间。
每个 CPP 文件中的所有#include 都有点复杂,是否有一个地方可以保存所有#include?
这是代码: std::vector foo(bool cond) { std::vector 结果; 如果(条件){ 返回结果; // (1) } 结果.push_back(42); 返回结果; ...
假设 data.h 中有一个模板变量: 模板 结构数据 { 数据()=删除; 数据(T initValue):值(initValue){} T值; }; 模板 外部数据<...
我正在遵循本教程来了解如何在 C++ 中返回智能指针和协方差。 #包括 #包括 可克隆类 { 民众: 虚拟~
识别 MacOS 中的 std::execution::par C++ 功能
有人有机会让 macOS Sonoma 14.5 (M3 Macbook) 上的 C++ IDE 识别 #include 中的 std::execution::par 吗? 我想要的是简单地编译这段代码......