草庐IT

c++ - 我如何对类型进行 static_assert?

灵感来自thisquestion上的评论之一我想在我的代码中写这个,因为我可能做出了错误的假设,如果我将代码移植到两种类型不同的平台,就需要调查。static_assert(typeid(float)==typeid(GLfloat),"GLfloatisunexpectedtype");然而,这并没有编译,因为错误:调用非constexpr函数‘boolstd::type_info::operator==(conststd::type_info&)const’不过我可以这样写:-static_assert(sizeof(float)==sizeof(GLfloat),"GLfloat

c++ - ASSERT 是多余的吗?

ASSERT(pointer);pointer->x;在这段代码中,ASSERT似乎是多余的。如果指针为NULL,pointer->x无论如何都会失败。我的论点正确吗? 最佳答案 断言的重要(如果不是主要的话)目的是记录应该在代码中的特定点保持的不变量。如果不变量被破坏,assert也可以中止程序这一事实只是锦上添花,尽管它非常有用。我想说的是,在一个典型的程序中,90%的断言都是显然不会失败并且永远不会失败的断言。也就是说,assert在很大程度上是一种形式化的注释语言。从某种意义上说,这些“注释”是用相同的语言编写的,其余代码是

c++ - NDEBUG 和 _DEBUG 在 Visual Studio 2015 中定义在哪里?

我可以转到默认VisualStudio2010项目的设置,并查看在“配置属性”>>“C/C++”>>中定义的NDEBUG或_DEBUG“预处理器”的“预处理器定义”:如果我转到默认VisualStudio2015项目的设置,“预处理器定义”是空的!我什至没有在VisualStudio2015.vcxproj中看到NDEBUG或_DEBUG。我知道它的定义是正确的,因为assert(false)只在调试配置中触发。Microsoft将这些定义隐藏在VisualStudio2015的什么地方?我可以修改它们吗,还是已经被我拿走了?编辑:Niall'sanswer是正确的。我不明白的是,如果

c++ - 科学计算人员的异常与断言(我是我的代码的唯一用户)?

Exceptionsvsassert之前在这里被问过:Designbycontractusingassertionsorexceptions?,AssertionVSRuntimeexception,C++error-codesvsASSERTSvsExceptionschoiceschoices:(,Designbycontractusingassertionsorexceptions?等(*)也有书籍,如HerbSutter的编码标准,讨论了这一点。普遍的共识似乎是这样的:Useassertionsforinternalerrors,inthesensethattheuseroft

c++ - 我可以在构造函数的初始化列表中执行完整性检查吗?

通常鼓励使用初始化列表。现在假设我有以下代码(只是为了使问题更清楚的简单示例):classfoo{public:foo(ptr1*a,ptr2*b):m_a(a),m_b(b),m_val(a->val){}/*codeandmembershere*/};在尝试取消引用它以获取val之前,我想检查a是否为NULL。有什么方法可以在那里执行完整性检查吗? 最佳答案 Usetheternaryoperator:#includeclassTest{intx;public:Test(int*px):x(px?*px:-1){printf("

C++单元测试检查输出是否正确

如果我想编写自己的test.cpp来检查另一个.cpp文件是否按照我希望的方式输出,是否可以在不显式打印的情况下执行此操作?换句话说,有没有什么assert(output_of_file_being_tested,"thisisthecorrectoutput");其中output_of_file_being_tested是应该被“cout”的东西。 最佳答案 解决方案不是对输出流进行硬编码。以某种方式将对std::ostream的引用传递给您的代码,并使用std::stringstream在测试环境中收集输出。例如,这是您的“另一

c++ - 关于 ints 和 static_assert 的特化

我想编写一个仅适用于2个数字(例如3和5)的模板函数,如果您尝试将其与其他数字一起使用,则会出现错误。我可以这样做:templatevoidf();templatevoidf(){cout()\n";}templatevoidf(){cout()\n";}然后我可以用正常的方式调用这个函数:f();f();它编译得很好,如果我尝试错误地使用我的函数:f();编译器给我一个错误。这种方法有两个问题:1.-这是标准吗?我可以使用整数专门化模板吗?2.-我不喜欢使用这种方法时出现的错误,因为错误不会告诉用户他做错了什么。我更喜欢写这样的东西:templatevoidf(){static_as

c++ - 构造函数的初始化列表之前的 static_assert

有一个非模板化的类,它有一个模板化的构造函数。是否可以在此类构造函数中初始化成员变量之前检查静态断言?​​例如,下面的代码在检查T是否有这样的方法之前执行T::value()。classMyClass{public:templateMyClass(constT&t):m_value(t.value()){static_assert(HasValueMethod::value,"Tmusthaveavalue()method");}private:intm_value;};将static_assert放在构造函数的主体中工作正常,除了它在最后打印“Tmusthaveavalue()met

c++ - 在编译时查找数组中的重复项

我正在尝试学习一些更现代的C++实践,例如模板,我决定创建一个天真而简单的命令行参数解析器,它主要在编译时运行,我已经遇到了constexpr的问题。,基本上我想做的就是在编译时检查重复的条目(在运行时做这件事很简单)。首先,我有一个包含单一配置的结构:structArg_Opt_Tuple{std::string_viewmc{};//multicharie"help"charsc{};//singlecharie'h'boolis_flag{};};现在假设我想创建一个返回固定大小的std::array的函数(或最终是一个对象的构造函数),但也在编译时对重复值或空值进行一些检查,我

c++ - 应该用 typedef 触发 static_assert 吗?

我注意到当实例化为typedef时,类模板中的静态断言不会被触发。#includetemplatestructtest_assert{static_assert(std::is_same::value,"shouldfail");};typedeftest_assertt;这段代码编译没有错误。如果我尝试创建一个实例,则断言失败:tobj;//error:staticassertionfailed:"shouldfail"最后,如果我将条件替换为false,即使我不实例化类模板,断言也会失败:templatestructtest_assert{static_assert(false,"