将任何数据类型/对象作为参数传递以确定其大小
passing any data type / object as parameter to determine it's size
我很确定我已经在 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)
感谢您的帮助!
在C++中,你可以只使用模板函数:
template <typename T> void some_init_func(T* obj)
{
const size_t size = sizeof(T);
// ...
}
我怀疑这是否可能,特别是因为 C/C++ 中存在数据的填充。 sizeof()
存在是有原因的。
在C++中,您可以将函数转换为模板函数。这将强制在调用类型时传递类型。您可以使用函数内部的sizeof()
来计算该类型的传递对象的大小。
基本上,当对象大小作为void *
类型传递时,不可能获取对象大小,因为对象类型可以隐式转换为所需的任何对象。
但是,如果要谈论C++ - 抽象类是解决方案:
class Template {
public:
virtual void method1()=0;
virtual void method2(void *)=0;
};
在这种情况下,您不仅可以传递void *
类型对象,而是传递派生对象Template *
其中method2
可以在以后的实现中采用通用void *
参数,并将其转换为具有已知大小的所需对象类型。
相关文章:
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 为模板传递非类型参数 agument
- 如何使用宏根据参数定义不同的数据类型?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 将函数类型作为模板参数传递不会编译
- 通过参数传递 lambda(无函数类型模板)
- 参数数据类型未知的可变参数函数
- 具有相同数据类型代码的相同逻辑代码在 Java 中传递,但不在 C++ 中传递?
- 如何提取模板参数中传递的类型
- C++模板;作为模板参数传递的函数的自动推导返回类型
- 将私有数据成员作为默认参数传递给该类的公共方法时出错
- 在一行中将默认类型值上的指针作为参数传递
- 即使数据类型不同,是否有可能将帧的参数作为参数传递给回溯中的另一个帧
- 将任何数据类型/对象作为参数传递以确定其大小
- 函数有没有办法自动检测其参数的数据类型?(请不要建议函数重载)
- 使用自由模板参数传递模板类型名称
- 如果传递给函数的参数的数据类型是字符串类型,则抛出异常
- 传递参数时数据类型不匹配
- 如何初始化管理在实例化时传递数据类型的缓冲区的类