首页 > 解决方案 > 如何判断一个对象是否有堆分配的成员?

问题描述

有没有办法确定一个对象是否在堆上至少有一个成员?

我试图能够将对象std::stringstd::vectorstd::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;
};

foobar只是示例,并且该函数必须执行与控制台func()不同的功能。cout

标签: c++classtemplatesc++17member

解决方案


这是 XY 问题...我正在尝试编写一个哈希函数,该函数将知道用户定义的键类型是否在数组上存储任何数据(就像 std::string` 一样)。我相当能够创建一个采用任何类型的通用哈希函数,但是如果该类型有一个指向其中一些存储数据的数组(指针),问题就会变得非常棘手(指向动态数组的指针在运行时发生变化,相同的键在,不同的时间会产生不同的hash值)

请注意,某些结构/类类型具有内部未初始化的填充,这可能会使您的哈希函数无法正常工作。

否则,std::is_trivially_copyable将是一个好的开始。


推荐阅读