gpt4 book ai didi

C++ 静态成员函数与 lambda 开销

转载 作者:行者123 更新时间:2023-12-02 18:28:41 28 4
gpt4 key购买 nike

我有某种模板化基类

template<typename Derived>
class Base { };

并希望将其派生实例存储在列表中。为此,我使用 using derived_handle = std::unique_ptr<void, void(*)(void*)别名。

当我现在将派生实例添加到列表中时,我可以使用静态成员函数作为删除器

class foo {

template<typename Derived, typename... Args>
void add_base(Args&&... args) {
auto derived = derived_handle{new Base{std::forward<Args>(args)..., &foo::_deleter<Derived>};

_derived.emplace_back(std::move(derived));
}

private:

template<typename Baser>
void _deleter(void* base) {
delete static_cast<Base*>(base);
}

std::vector<derived_handle> _derived{};

};

或 lambda

class foo {

template<typename Derived, typename... Args>
void add_base(Args&&... args) {
auto deleter = [](auto* derived){
delete static_cast<Derived*>(derived);
}

auto derived = derived_handle{new Base{std::forward<Args>(args)..., std::move(deleter)};

_derived.emplace_back(std::move(derived));
}

private:

std::vector<derived_handle> _derived{};

};

我应该注意 lambda 版本的优点/缺点吗?

最佳答案

是时候进行框架挑战了!

您在该代码中做出了一些错误的决定。大多数人使用unique_ptr ,即使在多态上下文中,也根本不需要自定义删除器。你这样做的唯一原因是因为你的类型删除,而这只是因为 Base<A>Base<B>是不相关的类型。

如果您确实需要Base<T> ,让它从具有虚拟析构函数的实际多态(非模板化)基类继承。那你就不需要 unique_ptr<void> (非常糟糕的代码味道),并且您实际上可以以类型安全的方式使用列表。

关于C++ 静态成员函数与 lambda 开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69738619/

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