c++ - 如何判断一个对象是否有堆分配的成员?
问题描述
有没有办法确定一个对象是否在堆上至少有一个成员?
我试图能够将对象std::string
或std::vector
或std::list
(是的,主要是容器)与所有其他类型区分开来(不幸的是,即使是具有单个元素的容器也在我的“感兴趣的范围内”)
我正在尝试执行以下操作:
struct foo
{
private:
int * _ptr;
public:
foo() : _ptr(new int) {};
~foo() { delete _ptr; };
};
struct bar
{
private:
int val;
};
template <typename T>
void func(T val)
{
if constexpr (std::is_class_v<T>)
{
std::cout << std::setw(20) << typeid(T).name() << " is a class type." << std::endl;
if (/* determine if foo has any heap allocations */)
{
// Do something #1.
std::cout << std::setw(20) << typeid(T).name() << " does allocate on heap." << std::endl;
}
else
{
// Do something #2.
std::cout << std::setw(20) << typeid(T).name() << " does NOT allocate on heap." << std::endl;
}
}
else
{
// Do something #3.
std::cout << std::setw(20) << typeid(T).name() << " is NOT a class type." << std::endl;
}
}
int main()
{
func(foo()); // foo does allocate on heap
cout << endl;
func(bar()); // bar does NOT allocate on heap
cout << endl;
};
类foo
和bar
只是示例,并且该函数必须执行与控制台func()
不同的功能。cout
解决方案
这是 XY 问题...我正在尝试编写一个哈希函数,该函数将知道用户定义的键类型是否在数组上存储任何数据(就像 std::string` 一样)。我相当能够创建一个采用任何类型的通用哈希函数,但是如果该类型有一个指向其中一些存储数据的数组(指针),问题就会变得非常棘手(指向动态数组的指针在运行时发生变化,相同的键在,不同的时间会产生不同的hash值)
请注意,某些结构/类类型具有内部未初始化的填充,这可能会使您的哈希函数无法正常工作。
否则,std::is_trivially_copyable
将是一个好的开始。
推荐阅读
- javascript - 如何比较三个数组的长度?Javascript
- python - 如果已验证,如何检索 Instagram 用户名?
- c# - 如何在 Typed HttpClient 示例中实现 IHttpFactoryClient?
- wordpress - MAMP/WordPress 异常缓慢
- three.js - Three.js - 克隆后之前的行变得不可见
- node.js - Node.js / Express js:使用 Webhook 密码和类型的最佳实践
- javascript - 为什么我不能在 JavaScript boxShadow 中包含模糊半径?
- docker - 构建多容器 docker-compose 无法构建前端
- php - 测试 windows rdp 凭据使用和密码
- r - 您可以在 R 包中设置 xgboost 全局详细级别吗?