有一个非模板化的类,它有一个模板化的构造函数。是否可以在此类构造函数中初始化成员变量之前检查静态断言?例如,下面的代码在检查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
我注意到当实例化为typedef时,类模板中的静态断言不会被触发。#includetemplatestructtest_assert{static_assert(std::is_same::value,"shouldfail");};typedeftest_assertt;这段代码编译没有错误。如果我尝试创建一个实例,则断言失败:tobj;//error:staticassertionfailed:"shouldfail"最后,如果我将条件替换为false,即使我不实例化类模板,断言也会失败:templatestructtest_assert{static_assert(false,"
我如何静态断言表达式是std::unique_ptr即std::unique_ptr对于任何T.static_assert(std::is_pointer()),"notasmartpointer")以上无效。如果没有什么直截了当的,我只对bool()感兴趣运算符是为类型定义的。 最佳答案 通过适当的部分特化创建您自己的特征:templatestructis_unique_ptr:std::false_type{};templatestructis_unique_ptr>:std::true_type{};
如果我得到的类型声明不包含Q_OBJECT宏,我有一些有趣的需要显示编译错误。我发现了一种不好的方法。实际上它重复了Qt开发人员的想法来做同样的事情:templatevoidcheckForQObjectMacro(){reinterpret_cast(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast(0));}这很好用,但确实给出了奇怪的错误消息。我想显示一条可读的消息。一种方法是使用static_assert构造。但我不知道如何实现Q_OBJECT宏存在的静态验证条件。也许有人可以提出一个漂亮的黑客?也非常感谢任何想法。
我知道有人提议使用constexpr()运算符,但这还没有在gcc/clang中实现。我也知道有一个使用机器代码编辑等技巧的实现:http://saadahmad.ca/detecting-evaluation-context-inside-constexpr-functions/我想知道是否有一个有点受限的解决方案:structF{constexprF(intv){ifconstexpr(constexpr()){static_assert(v>0);}else{assert(v>0);}}};//...constexprFf{0};//shouldtriggeracompile-t
我在这样的断言语句中收到警告controllingexpressionisconstant:assert(...&&"errormessage");为什么要对这个断言发出警告?我怎样才能抑制这个警告?NVCC是NVIDIA的cuda编译器,我觉得是基于LLVM的。为什么它会发出此警告,而GCC或VisualC++编译器可以正常编译? 最佳答案 可移植的替代方案(可能包含在宏中)类似于:{constboolerror_message=true;assert([...]&&error_message);}澄清我的意思:#definemy
代码示例:templatestructSUM{static_assert(x>=0,"Xmustbegreaterorequalto0");enum{VALUE=x+SUM::VALUE};};templatestructSUM{enum{VALUE=0};};intmain(){std::cout::VALUE为什么编译器不会在第一个static_assert时中断编译,而是继续工作直到达到最大实例化深度?Invoking:GCCC++Compilerg++-O0-g3-Wall-c-fmessage-length=0-std=c++11-MMD-MP-MF"src/Main.d"-
是否允许标准Cassert(e)宏多次计算e?C++11或更高版本呢?我在theOpenGroupspec中看不到任何保证,并且通过一些搜索(1、2),答案对我来说并不明显。上下文:在assert(func()!=NULL)中可以多次调用func()吗?是的,出于其他原因我已经知道这是个坏主意:如theglibcmanual指出,如果定义了NDEBUG,则根本不会评估assert()的参数。但是,假设NDEBUG未定义,最大次e是否有任何保证?thisone提示的问题. 最佳答案 C标准说在C11标准(ISO/IEC9899:201
有没有办法使用detectionidiom(或其他方法)测试一个函数是否对给定的模板参数有效,如果它由于static_assert?而失败下面的示例说明了foo的有效性(失败的返回类型计算)按预期被检测到,但是bar的有效性(失败的static_assert)不是。#include#includetemplateusingvoid_t=void;templateclassOp,class...Args>structdetector:std::false_type{};templateclassOp,class...Args>structdetector>,Op,Args...>:std
这个版本根本无法编译:structA{voidfoo(){static_assert(0,"Fail");}};这个版本编译没有错误(至少在我的编译器版本中):templatestructB{voidfoo(){static_assert(x,"Fail");}};Bb;只有当我调用b.foo();时,第二个版本才编译失败,所以我想知道如果我从不调用方法,标准是否允许使用第二个版本>富?所有编译器都会以相同的方式运行吗?这不是未定义的行为吗?我想在代码中包含static_assert以在某些模板参数满足某些条件时禁止使用模板类的某些方法。static_assert的用法是否正确?我想在