传递任何数据类型/对象作为参数以确定它的大小

时间:2017-03-22 07:28:15

标签: c++ c

我很确定我已经在C中找到了我的问题的答案,但对Cpp不确定。

typedef struct strXXX {
    uint16_t member1;
    uint8_t member2;
    // ...
} XXX;

XXX tst;

void some_init_func(void * obj, uint16_t sz)
{
    obj = &tst;
    size = sz;
}

在调用 some_init_func 时,必须给出尺寸:

sizeof(tst)

有没有办法将任何对象或数据类型传递给 some_init_func ,并确定函数中对象的大小?

我认为在C / Cpp中不可能,因为你可以传递指针,但不能从它的指针确定对象本身的大小,
但是我想知道你们中的一些硬编程员是否找到了关于这些语言缺乏的解决方法?

...除了这种宏之外(由于尺寸参数可能不在对象地址之后,因此不会一直执行此操作):

#define PASS_OBJ(obj)    &obj, sizeof(obj)

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

在C ++中,您可以使用模板函数:

template <typename T> void some_init_func(T* obj)
{
    const size_t size = sizeof(T);

    // ...
}

答案 1 :(得分:1)

我怀疑它是否可能,特别是因为C / C ++中存在padding of datasizeof()是有原因的。

在C ++中,您可以将函数转换为模板函数。每当你调用它时,这将强制传递类型。您可以在函数内使用sizeof()来计算该类型的传递对象的大小。

答案 2 :(得分:0)

基本上,当它以void *类型传递时,不可能获得对象大小,因为对象类型可以被隐含地转换为您想要的任何对象。

但是,如果要谈论C ++ - 抽象类是解决方案:

class Template {
public:
  virtual void method1()=0;
  virtual void method2(void *)=0;
};

在这种情况下,您不能传递void *类型对象,而是Template *派生对象,其中method2可以采用通用void *参数,稍后执行并将其转换为需要已知大小的对象类型。