草庐IT

inline-namespaces

全部标签

c++ - 声明是否可以转义其封闭的 namespace ?

我正在尝试编写一个宏来帮助构建具有各种辅助函数的enumclass,例如用于转换为字符串。在某种集合中提供对枚举的所有值的访问是很自然的:DEFINE_ENUM(Foo,Value1,Value2);for(Foov:enum_traits::all_values){//...}这似乎可以通过使DEFINE_ENUM()宏专门化一个通用的enum_traits类来实现://globally:templatestructenum_traits{};//insidethemacro:#defineDEFINE_ENUM(Name,...)\/*define"enumclassName"..

C++ ASM Inline如何使用boolean?

说我有这样的东西..boolisPatched;我有一些其他GUI,我在其中设置了isPatched=true;和isPatched=false;,isPatched=!isPatched;void__declspec(naked)test(void){//__asm{PUSHADPUSHFDMOVEAX,isPatchedCMPEAX,0jenoPatchedMOVEAX,DWORDPTRDS:[ESI+0x77C]MOVJohn.oldA,EAXMOVEAX,John.AMOVDWORDPTRDS:[ESI+0x77C],EAXJMPfinishnoPatched:PUSHEDXM

c++ - 是否可以检测 C++ 中的 namespace 成员身份?

对于C++类型,header为我们提供了许多有用的编译时反射功能。例如。std::is_base_of::value在编译时确定是否B是D的基类.我想知道是否可以按照类似的方式检测命名空间成员资格?例如。给定一个命名空间N类型T,有没有办法确定是否T包含在N中使用IS_NAMESPACE_MEMBER_OF(T,N)形式的宏表达式.我更喜欢通过任何类型的SFINAE/ADL类型的技巧获得编译时答案。或者,如果这是不可能的,那么标准不允许这样做的某种推理。一个不可移植的运行时hack是正则表达式typeid(T).name()对于N,但这相当乏味,而且不是在编译时。EDIT1:正如K-b

c++ - 在 C++ 中定义 namespace 内的类有什么好处?

我有一个x.cpp文件,我在其中看到一个在命名空间内定义的类。所以,我的问题是:1)在命名空间内定义一个类有什么好处?2)其次,我还看到在同一个x.cpp文件中定义了命名空间之外的结构。那么,在同一个x.cpp文件中这样做有什么好处呢?x.h看起来像下面这样:classx{private:structabc;};x.cpp看起来像:namespace{class{};}structx:abc{}; 最佳答案 匿名命名空间只能在其编译单元内访问。这意味着没有其他cpp可以访问x.cpp匿名命名空间中的任何内容。namespace{cl

c++ - 为什么 GCC 不允许我创建 `inline static std::stringstream` ?

我会直接去MCVE:#includestructA{inlinestaticstd::stringstreamss;};海湾合作委员会7.2和7.1refusetocompile它有以下错误:error:nomatchingfunctionforcallto'std::__cxx11::basic_stringstream::basic_stringstream()'inlinestaticstd::stringstreamss;^~Infileincludedfromblah:1:0:/opt/compiler-explorer/gcc-7.2.0/include/c++/7.2.0

c++ - C++中的 namespace 搜索

我发现了一个关于命名空间搜索的问题。以下简化代码编译失败:namespaceA{namespaceB{classTest{};}namespaceC{namespaceB{typedefB::TestAnAlias;}}}编译器提示命名空间A::C::B中的Test没有命名类型。问题似乎是编译器在命名空间C中看到了命名空间B,但没有进一步搜索。我本以为他也会在命名空间A(这是一个封闭的命名空间)中查找并在那里找到B::Test。如果我重命名C::B一切都很好。如果我符合A::B::Test条件,一切都很好。如果我将typedef直接放在命名空间A::C中,一切都很好。此行为已使用gcc

c++ - SFINAE:当重载移动到其他 namespace 时,检查函数是否存在中断

我想使用SFINAE检查特定命名空间中是否存在函数。我找到了SFINAEtotestafreefunctionfromanothernamespace哪个完成了工作,但有些事情我不明白。目前我有这个工作代码,直接来自链接的问题://switchto0totesttheothercase#defineENABLE_FOO_BAR1namespacefoo{#ifENABLE_FOO_BARintbar();#endif}namespacedetail_overload{templatevoidbar(Args&&...);}namespacedetail{usingnamespacede

C++ `inline` 关键字和编译器优化

我一直听说inline关键字不再用作现代编译器的提示,而是用于避免多源项目中的多重定义错误。但是今天遇到了编译器服从关键字的例子。没有inline关键字,如下代码#includeusingnamespacestd;voidfunc(constintx){if(x>3)cout使用命令g++-O3-Sa.cpp,生成func未内联的汇编代码。但是,如果我在func的定义前添加inline关键字,func将被内联到main中。生成的汇编代码部分为.LC0:.string"HAHA\n".LC1:.string"KKK\n".text.p2align4,,15.globl_Z4funci.t

c++ - 奇怪的 C++ namespace 解析怪癖和 g++ 与 clang++

这个问题在这里已经有了答案:Injectedclassnamecompilerdiscrepancy(3个答案)关闭4年前。这始于观察。我更改了一些看起来有点像这样的代码(编辑:我在这里取出了指定的初始化器,它们也不在原始代码中):structS{enumE{E1,E2}member;}//file1.ccSv1={S::E1};//file2.ccSv2={S::S::E2};请注意file2.cc过度限定了E2。然而,这在g++和clang++中都有效。(编辑2:这个特定VM上的g++是g++-5.4.1,但原始代码已经通过早期和后来的g++版本,加上多个clang版本。)事实上,

c++ - 在这种情况下,为什么 g++ 和 clang 会破坏 namespace 抽象?

编译:structstr{};namespacea{voidfoo(strs){}}namespaceb{voidfoo(strs){}voidbar(strs){foo(s);}}intmain(int,char**){return0;}但这不是(将结构定义移到命名空间a内)namespacea{structstr{};voidfoo(strs){}}namespaceb{voidfoo(a::strs){}voidbar(a::strs){foo(s);}}intmain(int,char**){return0;}我得到的错误是bad.cpp:Infunction‘voidb::b