草庐IT

assert_equal

全部标签

c++ - 为什么 `assert` 宏即使与 `NDEBUG` 也有值(value)?

环境:$g++--versiong++(Ubuntu7.4.0-1ubuntu1~18.04)7.4.0众所周知,在包含assert.h之前定义的NDEBUG可以禁用用于调试的类函数宏assert(卡塞特)。但是,在我的环境中阅读/usr/include/assert.h,我发现了下面的代码。#ifdefined__cplusplus&&__GNUC_PREREQ(2,95)#define__ASSERT_VOID_CASTstatic_cast#else#define__ASSERT_VOID_CAST(void)#endif#ifdefNDEBUG#defineassert(exp

c++ - consteval 会允许在函数参数上使用 static_assert 吗?

目前您不能使用static_assert来验证constexpr函数的参数,即使对它的所有调用确实都是constexpr。这是有道理的,因为编译器仍然必须创建此函数的非constexpr实例,以防其他模块尝试调用它。遗憾的是,即使函数是static或在匿名命名空间中也是如此。但是,C++20将引入一个新关键字consteval,它类似于constexpr,但它不允许以非constexpr方式调用函数。在这种情况下,编译器可以确定函数参数在编译时总是已知的。因此,理论上应该可以使用static_assert来验证它们。问题是:标准允许吗?例子:#includeconstevalcharo

C++11 static_assert : Parameterized error messages

在mypreviousquestion我想使用static_assert将模板参数限制为特定的子类型。问题回答完毕,归档代码如下:templatestructX{static_assert(std::is_base_of::value,"TmustbederivedfromY!");};现在,我想让错误信息更简洁。即,我想说明哪种类型违反了此约束。例如,如果类A不是来自Y有人实例化了X,则错误消息应打印“类型参数必须从Y派生,但A不是”。这是否可以通过标准库以某种方式实现?我看到两个挑战:在编译时不使用boost::mpl组装字符串检索实例化T的类型的名称。该名称应该有意义,最好与违规

Equals() 的 C++ 双重分派(dispatch)

假设我有abstractbaseclassShape,与派生类Circle和Rectangle.classShape{};classCircle:publicShape{};classRectangle:publicShape{};我需要确定两个形状是否相等,假设我有两个Shape*指针。(这是因为我有两个vector的实例,我想看看它们是否具有相同的形状。)推荐的方法是doubledispatch.我想出的是这个(这里大大简化了,所以形状等于所有其他相同类型的形状):classShape{public:virtualboolequals(Shape*other_shape)=0;pr

c++ - std::set::equal_range 有什么用?

由于std::set不能包含重复元素并且总是排序的,std::set::equal_range将始终返回没有元素或只有1个元素的范围.从技术上讲,是的,这仍然是一个范围,但是这个算法的目的是什么?对于std::set来说似乎完全没有必要。 最佳答案 我只是猜测。但是,likecount(),当您在模板中并且不想确定您是在std::set还是其他关联容器上操作时,它有一些值(value)。基本上,这是为了保持一致性。该函数确实按照宣传的那样执行,只是它有问题使用versus如果您孤立地使用find()之类的东西。如果您真的想要开箱即用

c++ - ASSERT_TRUE() 返回类型与 gtest 中的函数类型不匹配

当我使用Gtest中提供的ASSERT_TRUE()时,出现以下错误。返回类型与函数类型不匹配,在VS2010.中带有下划线。abc.h#include"gtest\gtest.h"classabc{pubilc:boolfun();private:boolfun1();};abc.cboolabc::fun(){ASSERT_TRUE(fun1());//Gettingerror:returntypedoesnotmatchfunctiontype}boolabc::fun1(){returntrue;//Trueorfalsedepandingonoperation}

c++ - 为什么 std::equal 比两个小 std::array 的手卷循环慢得多?

我正在分析一小段代码,它是大型模拟的一部分,令我惊讶的是,STL函数equal(std::equal)比简单的for循环慢得多,比较两个数组元素元素。我写了一个小测试用例,我认为这是两者之间的公平比较,使用Debian文件库中的g++6.1.1的区别并非微不足道。我正在比较两个有符号整数的四元素数组。我测试了std::equal、operator==和一个小的for循环。我没有使用std::chrono来确定确切的时间,但是可以通过时间./a.out明确地看出差异。我的问题是,给出下面的示例代码,为什么operator==和重载函数std::equal(我相信它调用operator==

c++ - 我可以将 std::begin 和 std::end 专门化为 equal_range() 的返回值吗?

header提供std::equal_range(),以及一些将它作为成员函数的容器。这个函数让我困扰的是它返回一对迭代器,这使得从开始迭代器到结束迭代器的迭代变得乏味。我希望能够使用std::begin()和std::end()这样我就可以使用C++11基于范围的for循环。现在,我听到了关于特化的矛盾信息std::begin()和std::end()-有人告诉我,向std命名空间添加任何内容都会导致未定义的行为,而我也被告知您可以提供自己的std::begin()特化。和std::end().这就是我现在正在做的:namespacestd{template::iterator_ca

c++ - 借助 static_assert 改进诊断

在模板编程中,static_assert帮助程序员检查模板参数的约束并在违反约束时生成人类可读错误消息。考虑这段代码,templatevoidf(T){static_assert(T(),"firstrequirementfailedtomeet.");static_assert(T::value,"secondrequirementfailedtomeet.");Tt=10;//eventhismaygenerateerror!}我的想法是:如果第一个static_assert失败,这意味着一些T的要求不满足,因此编译应该停止,只生成第一个错误消息——因为继续编译只是为了生成越来越多

c++ - 用于确保设计契约(Contract)的 static_assert

作为开发人员团队的一员,我想确保在我们发布的自定义迭代器上实现一组函数(和运算符)。使用STL迭代器类型作为基类型会有所帮助,但是由于某些原因(超出我的控制范围),我们决定不强制执行STL兼容性。迭代器由同一个团队和整个公司的人员使用。我想设计一个使用迭代器类型并根据设计契约进行测试的模板类。例如,我希望迭代器实现operator++、operator--并声明所需的typedef。1>是否可以实现这样一个强制设计契约的模板类?可能使用static_assert?2>如果是,这是一个好的设计吗?引用:customiterator 最佳答案