草庐IT

c++ - 函数体内的 typedef 是一种不好的编程习惯吗?

我有一些类C并希望将其实例和方法的地址传递给测试函数Test_C_Foo1()中的某个仿函数。Functor是一个模板类,我必须提供类方法的类型(MEMFN1)作为其模板参数之一。我必须在某处定义MEMFN1类型,但不想更改C.h并且不想用它污染全局命名空间。我决定尽可能将typedef本地化,所以把它放在一个测试函数中——在MEMFN1实际使用的范围内。在函数体内使用typedef是一种好习惯吗?标准允许在函数体内使用typedef,仅在以下特定情况下限制它:Thetypedefspecifiershallnotbecombinedinadecl-specifier-seqwitha

c++ - 可以使用 C++11 decltype 为现有函数的函数指针创建 typedef 吗?

给定structA{intfoo(doublea,std::string&b)const;};我可以像这样创建一个成员函数指针:typedefint(A::*PFN_FOO)(double,std::string&)const;很简单,只是如果A::foo的签名发生变化,则需要更新PFN_FOO。由于C++11引入了decltype,是否可以用来自动推导出签名并创建typedef? 最佳答案 是的,当然:typedefdecltype(&A::foo)PFN_FOO;您也可以通过using定义类型别名关键字(感谢MatthieuM.

c++ - typedef 声明中的 typedef-name 是可选的吗?

当我看到以下代码在g++-4.2中编译时没有错误或警告时,我感到非常惊讶:typedefenumtest{one};我的假设是,如果您使用typedef关键字,它将需要一个额外的标识符,如:typedefenumtest{one}test;如前所述,g++-4.2甚至在没有警告的情况下接受它。Clang++3.0警告“warning:typedefrequiresaname”,类似地Comeau警告“warning:declarationrequiresatypedefname”,g++-4.6通知:“warning:'typedef'在此声明中被忽略"。我无法确定标准中允许这样做的位

c++ - 是否存在绝对需要 typedef 的情况?

考虑以下safeboolidiom的摘录:typedefvoid(Testable::*bool_type)()const;operatorbool_type()const;是否可以在没有typedef的情况下声明转换函数?以下不编译:operator(void(Testable::*)()const)()const; 最佳答案 啊,我只记得identity元函数。可以写operatortypenameidentity::type()const;identity的定义如下:templatestructidentity{typedef

c++ - 为什么 C++ 中的类型别名在其语法中使用 'using' 而不是 'typedef'?

显然,类型别名和模板化类型别名在语义上等同于typedef和typedef的扩展以支持模板。为什么会为这些创建带有using关键字的新语法,而不是使用typedefs作为第一个和一些带有单词typedef的语法扩展。注意:这不是“使用和typedef之间的区别”问题的克隆。我知道using具有定义一系列typedef的优势。我要问的是为什么标准的人决定让这个扩展使用using关键字而不是typedef关键字。这似乎只是增加了语言的困惑。 最佳答案 这里是BjarneStroustrup说他们为什么介绍using而不是扩展typede

c++ - 理解令人困惑的 typedef 语法

考虑以下代码片段typedefinttype;intmain(){type*type;//whyisitallowed?type*k;//whichtype?}我得到一个错误'k'isnotdeclaredinthisscope。编译器将type*k解析为type*和k之间的乘法。这个语法是不是很困惑?为什么C++标准允许type*type?因为语法是这样说的?为什么? 最佳答案 type*type;//whyisitallowed?C++113.3.2/1说:Thepointofdeclarationforanameisimmed

c++ - 在 C/C++ 中,是否有类似于 #ifndef 的指令用于 typedef?

如果我只想在未定义的情况下定义一个值,我会这样做:#ifndefTHING#defineTHINGOTHER_THING#endif如果THING是typedef的标识符,但没有定义怎么办?我想做这样的事情:#ifntypedefthing_typetypedefuint32_tthing_type#endif问题出现是因为我想检查外部库是否已经定义了boolean类型,但我愿意听取更通用的解决方案。 最佳答案 语言中没有这种东西,也不需要它。在单个项目中,您不应该有相同的typedef别名来引用不同的类型,因为这违反了ODR,如果

c++ - "typedef"在类型和别名标准符合之间吗?

我偶然发现了一些代码,其中typedef关键字位于类型和别名之间,例如ininttypedefINT;它在gcc和clang(liveexample)中编译。我对标准语的理解不是很好。所以我的问题是:这个标准符合吗?我可以依靠编译器来支持它吗? 最佳答案 typedef关键字在C中被归类为存储类说明符,尽管标准明确指出这是为了方便表达形式语言语法。尽管如此,typedef可以出现在与任何其他存储类说明符(例如extern或static)完全相同的位置。[C2011,6.7.1/5]事实上,该语法允许存储类说明符与声明中的类型说明符、

c++ - 你对 typedef'ing shared_ptr 的约定是什么?

我在typedef'ingboost::shared_ptr模板的命名约定之间来回切换。例如:typedefboost::shared_ptrFooPtr;在确定约定之前,我想看看其他人使用什么。你的约定是什么?编辑:对于那些将typedef嵌套在Foo中的人,Foo现在“知道”它的样子了绕过?它似乎打破了封装。这个怎么样:classFoo{public:typedefstd::vectorVector;};你现在不会这样做,对吗?:-) 最佳答案 回答:不要这样做。这对您和其他人都很方便。说出你的意思。

c++ - 如果我在 C 或 C++ 中执行 `typedef`,我什么时候应该在 typedef'ed 类型的末尾添加 `_t`?

这个问题在这里已经有了答案:C++typesuffix_t,_typeornone(4个回答)关闭4年前。我很困惑何时应该将尾随_t添加到typedef的类型?例如,我应该这样做:typedefstructimageimage_t;或者这个:typedefstructimageimage;一般规则是什么?另一个例子,我应该这样做:typdefenum{ARRAY_CLOSED,ARRAY_OPEN,ARRAY_HALFOPEN}array_type_t;或者这个:typdefenum{ARRAY_CLOSED,ARRAY_OPEN,ARRAY_HALFOPEN}array_type;请