gpt4 book ai didi

c++ - 胖 std::function 的精简替换

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:18:13 30 4
gpt4 key购买 nike

我正在尝试将我的对象打包为 64 字节(自行开发的属性),并且我需要保存 getter 和 setter 成员函数。

我真的很喜欢 std::function 但太大了:

sizeof(std::function<int(void)>)给出 40 个字节(VS2017,x64)。

我想知道是否有 std::function 的精简版16 字节大且内部没有额外分配?

更新:解决方案如下所示,两个成员函数需要 16 个字节 (x64)。成员函数指针成为模板参数,因此它们什么都不带,只存储对象指针和 vptr。

感谢@Yakk。

class Property
{
public:
virtual ~Property() {}

virtual QVariant value() const = 0;
virtual void setValue(const QVariant& value) = 0;
};

template<typename TYPE,
typename CLASS,
TYPE(CLASS::*get)() const,
void(CLASS::*set)(const TYPE &)>
class PropertyValue : public Property
{
public:
PropertyValueGet() = delete;
PropertyValueGet(PropertyValueGet const& ) = delete;
PropertyValueGet& operator=(PropertyValueGet const& ) = delete;

PropertyValueGet(CLASS* object) : m_object(object) {}

TYPE getValue() const {
return (m_object->*get)();
}

void setValue(const TYPE& value) {
(m_object->*set)(value);
}

// Property implementation
//
virtual QVariant value() const final {
QVariant v = QVariant::fromValue<TYPE>(getValue());
return v;
}

virtual void setValue(const QVariant& value) final {
setValue(value.value<TYPE>());
}

private:
CLASS* m_object = nullptr;
};

最佳答案

m_getter 的类型是decltype(m_getter)

在现代 C++ 中使用 std::mem_fn 是个坏主意 - lambda 表达式 是一种更清晰、更透明(对开发人员和编译器而言)的绑定(bind)方式参数。

Stephan T. Lavavej,在演讲中 “functional: What's New, And Proper Usage" , 提到了 std::bindstd::mem_fn 与 lambdas 相比的一些缺点:

memfn problems #0

memfn problems #1

bind problems

您应该改用lambda 表达式。例如:

auto my_getter = [](Foo& foo){ return foo.getter(); };

Foo some_foo;
my_getter(some_foo);

Foo some_foo;
auto my_getter = [&some_foo](){ return some_foo.getter(); };

my_getter();

关于c++ - 胖 std::function 的精简替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49133466/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com