【问题标题】:C++ Determine the type of a variable and use it within sizeof()C++ 确定变量的类型并在 sizeof() 中使用它
【发布时间】:2011-07-16 23:23:33
【问题描述】:

我想用 C++ 编写一个宏,它将值 0 赋予表的每个元素。例如,在声明i 后:int i[10];,宏 fill_with_zeros(i) 将产生这种效果:

i[0] = 0;

i[1] = 0; 等等。

这是它的代码:

#define fill_with_zeros(xyz) \
    for(int l = 0 ; l < sizeof(xyz) / sizeof(int) ; l++) \
        xyz[l] = 0;

问题是我希望它可以处理多种类型的表:char、int、double 等。为此,我需要一个函数来确定xyz 的类型,而不是sizeof(int)我可以使用 sizeof(typeof(xyz)) 之类的东西。

存在类似的线程,但人们通常希望打印类型名称,而我需要在 sizeof() 中使用名称。有什么办法吗?

提前致谢

【问题讨论】:

  • 只是一个问题。为什么不int i[10] = { 0 }; ?甚至memset ?
  • @vpprof:虽然有些时候和地方适合使用宏,但这不是其中之一。特别是因为像 memset() 这样的解决方案可以满足您的需求,但效果更好。除非确实需要,否则最好避免在 C++ 中使用宏。
  • 没错,没有什么比 memset 更聪明(对表来说更快)了。此外,在处理堆分配表时,您仍然需要知道确切的大小,因为 sizeof 对您没有帮助。

标签: c++ types sizeof typeof typeid


【解决方案1】:

为什么你认为你需要一个宏呢?这应该有效:

// Beware, brain-compiled code ahead!
template< typename T, std::size_t sz >
inline void init(T (&array)[sz])
{
  std::fill( array, array+sz, T() );
}

如果T 允许,我希望我的标准库实现能够优化std::fill() 以自行调用std::memset()(或类似的东西)。

请注意,这实际上并没有将元素归零,而是使用默认构造的对象进行初始化。这对于所有可以归零的类型都实现了相同的效果,并且适用于许多不能归零的类型。

【讨论】:

  • 对大脑编译非常好,我个人觉得大脑编译器有时有点慢并且有错误的解析方法:P
  • Muchmemset 更好的解决方案,这几乎总是错误的答案,践踏了我们漂亮的抽象......我认为你的意思是 sz 而不是 @ 987654328@ 在您的电话中。当然,这引出了一个问题“为什么不使用std::vector 并完成它”
  • @Jesus:公平地说,代码是this one 的改编版本。但是你知道,这种看似简单和无辜的改编通常会引入一个只有更改代码的人才能看到的明显错误。 Nemo 再次证明了这一点……
【解决方案2】:

为什么不直接使用memset(xyz, 0, sizeof(xyz));

所有内置类型(整数和浮点数)的所有位 0 = 零。

【讨论】:

  • 如果xyzdouble 的数组怎么办? TTBOMK 不能保证您可以合法地将浮点值归零。
【解决方案3】:

数组的长度可以确定为sizeof(xyz) / sizeof(xyz[0])。但是,已经有 ZeroMemorymemset 函数可以满足您的需求。

【讨论】:

    【解决方案4】:
    #define fill_with_zeroes(arr) \
        for (int l = 0; l < sizeof(arr) / sizeof(arr[0]); l++) \
            arr[l] = 0;
    

    或者直接拨打memset(arr, 0, sizeof(arr));

    我建议改用 memset 或 int i[10] = { 0 };

    【讨论】:

      【解决方案5】:

      为什么不直接使用&lt;cstring&gt; 中的std::memset?这就是它的设计目的,并且在大多数情况下会运行得更快。

      int i[10];
      memset (i, 0, sizeof (i));
      

      【讨论】:

        【解决方案6】:

        你应该像其他人建议的那样使用memset,但如果你真的想走宏观路线:

        #define fill_with_zeros(xyz) \
        for(size_t l = 0 ; l < sizeof(xyz) / sizeof(xyz[0]) ; l++) \
            xyz[l] = 0;
        

        【讨论】:

          猜你喜欢
          • 2021-03-04
          • 2021-10-12
          • 2013-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多