0

我一直在尝试清理继承的代码库。它广泛使用包含尾随返回类型的模板函数。它还包括许多指向非模板化、非成员函数的函数指针。在清理过程中,我发现在 Visual Studio 2013 下等效于以下工作的代码:

#define function typedef auto

function Kernel (int, int) -> int;

struct Transform
{
    Kernel* kernel;
    char*   description;
};

Transform add_transform { add, "add" };

这个 typedef 在 C++11 标准中有效吗?

虽然我个人避免像瘟疫一样使用#defines(尤其是在用于创建像这些“函数”这样的新语言特性时),但鉴于项目中尾随返回类型的普遍存在,团队认为这将使代码库的可读性显着提高。

4

3 回答 3

4

尾随返回类型语法是 C++11 中的新语法,它在您可以编写函数类型的任何地方都有效。auto <function>(<parameters>) -> <result>简直是一种花哨的写法<result> <function>(<parameters>)(好处<result>可以参考<parameters>)。

这意味着typedef auto Kernel (int, int) -> int;完全有效,并且与typedef int Kernel (int, int);. Kernel然后可以在函数声明或函数指针中使用该typedef。

于 2015-02-22T17:55:42.257 回答
3

使用宏重新发明 C++ 语法可能很诱人。你可能会想出一些像这样很酷的东西,然后想“哇,这更清楚了”。

这种方法最根本的问题是它对发明宏的人来说更具可读性,或者如果你对 C++ 不够了解。如果您完全理解这typedef auto fn(int) -> int意味着什么,那么您将不再发现您的宏完全有用。语法已经很清楚了。

为了使事情复杂化,您引入了宏的所有无数问题。您正在全面劫持function符号名称 - 无论范围如何。现在你不能再使用std::function. 你不仅不能使用它,而且它会抛出一些根本没有描述性的令人讨厌的编译器错误。编译器将尝试解析std::typedef auto哪些是无意义的。

于 2015-02-22T18:08:41.387 回答
2

它是有效的,因为它auto(int, int) -> int;是一个函数声明符,只是它缺少名称。名称 ,Kernel是说明符用来typedef创建类型名称的标识符。由于存在尾随返回类型,因此auto被替换为. 如果您想让您的团队相信这是徒劳的,请考虑实现相同语法的方法:intint(int, int)

using Kernel = int(int, int);
using Kernel = auto(int, int) -> int;
typedef auto Kernel(int, int) -> int;

这些在语义上都是等效的,并且避免使用宏。

于 2015-02-22T18:20:57.343 回答