C++11 c++;11带尾随返回类型的typedef函数指针
我一直在尝试清理继承的代码库。它广泛使用了包含尾部返回类型的模板函数。它还包括许多指向非模板、非成员函数的函数指针。在清理过程中,我发现代码相当于Visual Studio 2013下的以下工作:C++11 c++;11带尾随返回类型的typedef函数指针,c++11,function-pointers,typedef,trailing-return-type,C++11,Function Pointers,Typedef,Trailing Return Type,我一直在尝试清理继承的代码库。它广泛使用了包含尾部返回类型的模板函数。它还包括许多指向非模板、非成员函数的函数指针。在清理过程中,我发现代码相当于Visual Studio 2013下的以下工作: #define function typedef auto function Kernel (int, int) -> int; struct Transform { Kernel* kernel; char* description; }; Transform add
#define function typedef auto
function Kernel (int, int) -> int;
struct Transform
{
Kernel* kernel;
char* description;
};
Transform add_transform { add, "add" };
这个typedef在C++11标准中有效吗
虽然我个人避免使用类似瘟疫的定义(特别是用于创建新的语言功能,如“函数”),但考虑到项目中尾部返回类型的普遍性,团队认为这将使代码库更具可读性。尾部返回类型语法在C++11中是新的,它在任何可以编写函数类型的地方都是有效的
auto()->
只是一种奇特的书写方式()
(其优点是
可以参考
)
这意味着
typedef自动内核(int,int)->int
是完全有效的,其含义与typedefint内核(int,int)完全相同代码>。然后,可以在函数的声明中使用TyWIFF,或者使用函数指针。使用/MUP>可以很容易地使用宏重新创建C++语法。你可能会想出这样一个很酷的主意,然后想“哇,这太清楚了”
<> P>这个方法最根本的问题是它对创建宏的人来说是更可读的,或者如果你不太了解C++的话。如果您完全理解了typedef auto fn(int)->int
的含义,那么您将发现宏不再有用。语法已经足够清晰了
为了使事情复杂化,您引入了大量宏问题。您正在全面劫持函数
符号名称-无论范围如何。现在您不能再使用std::function
。您不仅不能使用它,而且它还会抛出一些糟糕的编译器错误,这些错误根本不是描述性的。编译器将试图解析std::typedef auto
,这是胡说八道。这是有效的,因为auto(int,int)->int
是一个函数声明符,只是它缺少一个名称。名称Kernel
,是typedef
说明符用于创建类型名称的标识符。由于存在尾随返回类型,auto
被int
替换,它变为int(int,int)
。如果你想让你的团队相信它是徒劳的,那么考虑一下你可以达到相同语法的方法:
using Kernel = int(int, int);
using Kernel = auto(int, int) -> int;
typedef auto Kernel(int, int) -> int;
它们在语义上都是等价的,避免使用宏 typedef自动内核(int,int)->int代码>是合法的。尽管如此,我还是喜欢尝试将std::function
与该宏一起使用。我完全同意——不幸的是,我的团队不同意!我希望它依赖于编译器,这样我就可以阻止他们使用它代码>更可读,实际上是有效的C++语法。<代码>使用内核= Auto(int,int)-int;也是有效的,但是在这一点上你可以看出这是多么愚蠢。#define
看起来更像是一个出错的恶作剧。感谢你确认它在c++11中是合法的。事实上我很喜欢typedef auto。。。形式,因为它符合我的数学背景。也就是说,我讨厌#定义,我希望情况不会如此。