有没有可能从函数中得到sizeof

Is it possible to get sizeof from a function?

本文关键字:sizeof 函数 有可能      更新时间:2023-10-16

我这样调用一个函数:

void do_work(void* ptr, size_t size)
{
    //do things with ptr and size
}

问题是:是否有可能调用像do_work(one);这样的函数,并以某种方式获得函数内部的sizeof ?

给定one一个静态数组 (int one[10];)或非数组 (int one;),这是可能的吗?

在c++中,您可以使用模板参数推导来获得指针的类型(指向类型),然后计算其sizeof:

template<typename T>
void do_work( T* ptr )
{
    constexpr std::size_t size = sizeof(T);
}

可以使用函数模板:

template <typename T>
void do_work(T* stuff)
{
  const size_t s = sizeof(T);
  ....
}

Edit: version for arrays:

template<typename T, size_t N >
void do_work(T (&array)[N] )
{
  const size_t s = N * sizeof(T);
}

不,对于void *,您将无法计算传递地址的对象的大小。

template <typename T>
void do_work(T * t) { do_work(t, sizeof(T)); }
template<typename T>
void do_work(T* ptr)
{
    size_t size = sizeof(T);
    size = sizeof(*ptr); // or this
}

我不懂c++,这个问题出现在我面前,可能是因为它之前有C标签。但这是你可以在C中做的,可能也可以在c++中做:

#define do_work(_a_) do_work_func(_a_, sizeof(_a_))
void do_work_func( void* ptr, size_t size )
{
    //do things with ptr and size
}

如果do_work( one );调用中的one被定义为数组,则

如果我说对了,你可能会想:

#include <iostream>
void do_work(void* ptr, size_t size)
{
    std::cout << "Size: " << size << 'n';
}
template <typename T>
void do_work(T& single) {
    do_work(&single, 1);
}
template <typename T, std::size_t N>
void do_work(T (&array)[N]) {
    do_work(array, N);
}
template <typename T>
void do_work(T* multiple, std::size_t n) {
    do_work(static_cast<void*>(multiple), n);
}
int main()
{
    int a = 1;
    int b[] = { 1, 2, 3 };
    int* c = b;
    do_work(a);
    do_work(b);
    do_work(c, 3);
}