gpt4 book ai didi

c++ - 这个宏可以转换成一个函数吗?

转载 作者:可可西里 更新时间:2023-11-01 16:53:55 25 4
gpt4 key购买 nike

在重构代码并摆脱所有那些我们现在被教导讨厌的#defines 时,我遇到了用于计算结构中元素数量的这种美:

#define STRUCTSIZE(s) (sizeof(s) / sizeof(*s))

虽然非常有用,但可以将其转换为内联函数或模板吗?

好吧,ARRAYSIZE 会是一个更好的名字,但这是遗留代码(不知道它来自哪里,它至少有 15 年历史了)所以我“按原样”粘贴了它。

最佳答案

如前所述,代码实际上计算出数组中元素的数量,而不是结构中的元素数。我会在需要时明确写出 sizeof() 分区。如果我要使它成为一个函数,我想在它的定义中明确指出它需要一个数组。

template<typename T,int SIZE>
inline size_t array_size(const T (&array)[SIZE])
{
return SIZE;
}

以上类似于xtofl's , 除了它防止将指针传递给它(表示指向动态分配的数组)并错误地得到错误的答案。

编辑:根据JohnMcG 进行了简化.编辑:内联。

不幸的是,上面没有提供编译时答案(即使编译器确实内联并将其优化为引擎盖下的常量),因此不能用作编译时常量表达式。即它不能用作声明静态数组的大小。在 C++0x 下,如果将关键字 inline 替换为 constexpr(constexpr 是隐式内联的),这个问题就会消失。

constexpr size_t array_size(const T (&array)[SIZE])

jwfearn's编译时的解决方案工作,但涉及有一个 typedef,它有效地“保存”了新名称声明中的数组大小。然后通过使用该新名称初始化常量来计算数组大小。在这种情况下,不妨从一开始就将数组大小简单地保存为一个常量。

Martin York's发布的解决方案也在编译时工作,但涉及使用非标准 typeof() 运算符。解决这个问题的方法是等待 C++0x 并使用 decltype(届时人们实际上不需要它来解决这个问题,因为我们将拥有 constexpr ).另一种选择是使用 Boost.Typeof,在这种情况下我们将以

#include <boost/typeof/typeof.hpp>

template<typename T>
struct ArraySize
{
private: static T x;
public: enum { size = sizeof(T)/sizeof(*x)};
};
template<typename T>
struct ArraySize<T*> {};

并通过写作来使用

ArraySize<BOOST_TYPEOF(foo)>::size

foo 是数组的名称。

关于c++ - 这个宏可以转换成一个函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/95500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com