将此标记用于必须编译为C ++ 11的代码(不使用C ++ 14或更高版本中引入的任何功能)。
我一直在尝试制作一个矩形的二维数组,我希望索引 x 的数量打印在矩形旁边,索引 y 打印在矩形下方。 这是我的代码.. int 高度,宽度...
--trace-children-skip 选项对 Valgrind 没有任何影响
我有一个 run.sh : ./opt/exm/bin/exm_daemon exm_daemon 产生许多进程。 我使用以下选项运行 valgrind: sudo valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --trace-childre...
在 Qt、QtCreator 和 QMake 中配置 GCC 编译器开关
我最近尝试在 Windows 7(64 位)上使用 Qt Creator 1.3.2、Qt 4.6.2 和 GCC 4.4.0(32 位版本)来编译使用一些实验性 C++ 的应用程序0x 扩展并遇到了
我只是好奇枚举类是否可以是最终的......因为编译器给了我矛盾的结果。 考虑代码: #包括 枚举类 some_enums 最终 ...
我觉得这个问题已经很清楚了。 auto 关键字会自动检测 const 性,还是始终返回非 const 类型,即使存在例如。函数的两个版本(一个返回 const ,一个返回
下面的代码来自 Grokking Algorithms 书,它是函数式编程/递归的练习以及 D&C 概念的应用。该函数查找 ...
unique_ptr 传递给派生类,作为将 unique_ptr 传递给基类的函数的参数
我正在尝试在将 unique_ptr 传递给基类的函数中使用 unique_ptr 传递给派生类。就像是: 基类{}; 派生类:公共基类{}; 无效 f(unique_ptr...
我对这个问题做了一些研究,但还没有找到具体的解决方案。我真的很希望能够做到这一点: 公共委托 void VoidFloatCallback(float elapsedTime); ...
我在 C++ 多线程程序中遇到了一个奇怪的问题。 我编写了第一个代码,但没有看到比单线程代码有任何性能改进。 我一直在尝试改变......
有没有办法识别基类是否是虚拟基类? std::is_base_of 将识别基类,但我正在寻找类似 std::is_virtual_base_of 的东西来识别
为什么在windows上msvc无法捕获异常,而在Linux上GCC却无法捕获异常[重复]
Windows 和 Linux 上的相同文件如下: std_exp.cpp #包括 #包括 #包括 使用命名空间 std; int main() { 尝试 { 标准::标准...
为什么在windows上用msvc捕获异常而在Linux上用GUN捕获异常
Windows 和 Linux 上的相同文件如下: std_exp.cpp #包括 #包括 #包括 使用命名空间 std; int main() { 尝试 { 标准::标准...
我试图从cpp参考网站了解下面的代码是如何工作的: std::vector v{3, -4, 2, -8, 15, 267}; 结构体和 { void 运算符()(int n) { sum += n; } 整数总和{0}; ...
在 C++ Primer 中,它告诉我应该用 'extern' 修改所有 const 变量。然而,当我在 DevC++ 5.11 和 C++11 中尝试这样做时,我发现没有必要。 //主.cpp #包括<
Boost 库提供了一个方便的函数 hash_value ,它基本上只是调用: 返回哈希值()(key); 据我所知,C++11 包含 std::hash ,它与 boo 非常相似...
在 C++ Primer 中,它告诉我应该用 'extern' 修改所有 const 变量。但是,当我在 DevC++ 5.11 中尝试使用 C++11 时,我发现没有必要。 //主.cpp #包括 #包括&q...
是否可以从迭代器类型中检测容器类型? 例如, #包括 int main(){ static_assert(std::is_same< container_of 是否可以从迭代器类型中检测容器类型? 例如, #include<traits> int main(){ static_assert(std::is_same< container_of<std::vector<double>::iterator>::type, std::vector<double>>{}); static_assert(std::is_same< container_of<std::list<int>::iterator>::type, std::list<int>>{}); } (当然,某些迭代器类型不会提供容器(或不会提供唯一的容器),例如原始指针或流迭代器,但在这些情况下,它可能会软SFINAE失败。) 第一次尝试是 template<class T, template<class> class Cont> Cont<T> aux(typename Cont<T>::iterator it); template<class Iterator> struct container_of{ using type = decltype(aux(Iterator{})); }; 但是,它不起作用,因为编译器无法检测到 T 的类型(它不在可扣除的上下文中)。 动机:我想检测迭代器的关联容器是否有 .data() 成员。 不要让你的基元成为迭代器,而让你的基元成为一个范围。 template<class It, bool Contiguous, class D=void> struct range_t { using Self = std::conditional< !std::is_same<D, void>, D, range_t >; It b, e; It begin() const { return b; } It end() const { return e; } Self without_front( std::size_t i = 1 ) const { return {std::next(begin(), i), end()}; } Self without_back( std::size_t i = 1 ) const { return {begin(), std::prev(end(), i)}; } bool empty() const { return begin()==end(); } std::size_t size() const { return std::distance( begin(), end() ); } }; template<class It> struct range_t<It, true, void>: range_t<It, false, range_t<It, true>> { using Base = range_t<It, false, range_t<It, true>>; range_t( It b, It e ):Base(b,e) {} auto* data() const { if (empty()) return nullptr; return std::addressof(*this->begin()); } } }; (手动)跟踪哪些容器是连续的: template<class T, class=void> struct is_contiguous_container : std::false_type{}; template<class T> struct is_contiguous_container<T const, void> : is_contiguous_container<T> {}; template<class T> struct is_contiguous_container<T volatile, void> : is_contiguous_container<T> {}; template<class T> struct is_contiguous_container<T const volatile, void> : is_contiguous_container<T> {}; template<class T> struct is_contiguous_container<T, std::enable_if_t< has_data_ptr<T>{} >>: std::true_type{}; template<class T, std::size_t N> struct is_contiguous_container<T[N],void> : std::true_type{}; 连续的容器是数组、std::array和std::vector,所以不需要跟踪太多。 range_t< ?, true, ? > 也是连续的。 只要写 has_data_ptr,当且仅当 T.data() 返回一个指向非 void 的指针时,这是正确的。 template<class C> auto range( C&& c ) { using std:begin; using std::end; auto b = begin(c), e = end(c); using It = decltype(b); using R = range_t<It, is_contiguous_container<std::remove_reference_t<C>>{}>; return R{ b, e }; } range 现在可以智能地将容器转换为 range_t,并跟踪它是否连续。 range_t支持r.without_front( r.size()/2 )分而治之。 当范围是连续的时,只需对其调用 .data() 即可。 如果不是,请不要。 在您的应用程序中,如果您只想知道容器是否有 .data() 成员,检查它是否是随机访问可能就足够了(使用 std::iterator_traits<Iter>::iterator_category())。 否则,我认为您可能可以结合使用以下技术:如何检查两种类型是否来自同一模板化类以及每个标准容器类型的部分专业化。 或者等待c++17,它有一个新的连续迭代器概念:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4284.html 我现在正在做的是手动注册所有(实际上是一些)连续的迭代器。 由于我总是需要结合某种方法来提取原始指针,因此我直接编写了一个名为 data 的函数来返回指针。 代码并不有趣,它考虑了std::vector<>::iterator,std::basric_string<>::iterator,为了说明(以表明它总是不完整的)我还添加了boost::static_vector<>,原始指针和任何可转换为指针的东西。 (boost::array<>::iterator、std::array<>::iterator和begin/end(std::valarray)被有效地包含在内,因为迭代器是指针)。 我还必须包括 const_iterator 案例。 #include<type_traits> #include<vector> // the code below needs to know about std::vector #include<boost/container/static_vector.hpp> // ... and all possible contigous containers :( template< class ContiguousIterator, // well ProbablyContiguos typename = std::enable_if_t< /**/std::is_same<ContiguousIterator, typename std::vector<std::decay_t<decltype(*std::declval<ContiguousIterator>())>>::iterator>{} or std::is_same<ContiguousIterator, typename std::vector<std::decay_t<decltype(*std::declval<ContiguousIterator>())>>::const_iterator>{} or std::is_same<ContiguousIterator, typename std::basic_string<std::decay_t<decltype(*std::declval<ContiguousIterator>())>>::iterator>{} or std::is_same<ContiguousIterator, typename boost::container::static_vector<std::decay_t<decltype(*std::declval<ContiguousIterator>())>, 1>::iterator>{} or std::is_same<ContiguousIterator, typename boost::container::static_vector<std::decay_t<decltype(*std::declval<ContiguousIterator>())>, 1>::const_iterator>{} // many many other possible iterators :( or std::is_pointer<ContiguousIterator>{} or std::is_constructible<typename std::iterator_traits<ContiguousIterator>::pointer, ContiguousIterator>{} > > typename std::iterator_traits<ContiguousIterator>::pointer data(ContiguousIterator const& it){return std::addressof(*it);} int main(){ std::vector<double> v(30); v[0] = 10.; assert( *data(v.begin()) == 10. ); } 欢迎反馈。
关于以下代码我想澄清一下。我们有一个指向类的指针数组。接下来,我们使用基于范围的循环来遍历数组。对于这个基于范围的循环...
我正在使用 googletest 来使用 std::thread 测试多线程代码。在损坏的代码中,经常会发生 std::thread 在线程加入之前被销毁,从而导致程序终止。
何时使用C++11互斥锁、锁、unique_lock和shared_lock?
除了shared_lock的析构函数解锁关联的互斥体之外,shared_lock和shared_mutex.lock_shared()之间还有什么区别? Shared_mutex 是我可以使用的唯一互斥类吗...