首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何摆脱手工类模板参数规范

如何摆脱手工类模板参数规范
EN

Stack Overflow用户
提问于 2016-03-10 09:42:43
回答 1查看 155关注 0票数 5

还有比这更通用的编写Finalizer类的方法吗?

代码语言:javascript
复制
#include <functional>
#include <iostream>

template <typename T>
class Finalizer
{
public:
    Finalizer(const std::function<T>& f) : _f(f) {}

    ~Finalizer()
    {
        _f();
    }

private:
    std::function<T> _f;
};

int main()
{
    Finalizer<void()> finalizer([]() { std::cout << "str" << std::endl; });
}

我希望摆脱手动类模板参数规范,以便能够编写如下代码:

代码语言:javascript
复制
Finalizer finalizer([]() { std::cout << "str" << std::endl; });

有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-10 10:02:35

在C++中,类型推断仅适用于函数模板,而不适用于类模板。您需要一个make_finalizer函数来执行模板参数推导。

另外,您根本不需要使用std::function,不需要支付运行时成本,除非您确实希望它被类型擦除。

代码语言:javascript
复制
template <typename F>
class Finalizer
{
public:
    Finalizer(const F & c) : f_(c) {}
    Finalizer(F && c) : f_(std::move(c)) {}
    Finalizer(const Finalizer &) = delete;
    Finalizer(Finalizer && other) : 
          valid_(other.valid),
          f_(std::move(other.f_))
    {
         other.valid_ = false;
    }

    Finalizer& operator=(const Finalizer &) = delete;
    Finalizer& operator=(Finalizer && other)
    {
         Finalizer tmp(std::move(other));
         swap(tmp);
         return *this;
    }

    ~Finalizer()
    {
        if ( valid_ )
           f_();
    }

    void swap(Finalizer & other) noexcept
    {
         using std::swap;
         swap(other.valid_, valid_);
         swap(other.f_, f_);
    }

private:
    bool valid_ = true;
    F f_;
};

template<class F>
Finalizer< std::remove_reference_t<F> > at_scope_exit(F && x)
{
    return Finalizer< std::remove_reference_t<F> >(std::forward<F>(x));
}

并与auto一起使用:

代码语言:javascript
复制
 auto x = at_scope_exit([]() { std::cout << "Hello world" << std::endl; });
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35912747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档