【问题标题】:Proxying std::function via inheritance通过继承代理 std::function
【发布时间】:2015-11-07 00:17:26
【问题描述】:

我正在处理可能无效的原始函数指针(指向不正确的函数)/如果我正在与更新交互的应用程序(源不可用)为 null。我想创建一个继承 std::function 的类,它将重载 operator() 并在调用该类时向 stdout 发送消息,然后调用原始函数指针。这样做是为了让我能够轻松地隔离出哪个函数会因为空调用而崩溃。我不担心开销,因为只有使用 _DEBUG 才能在调试模式下使用它

因为 STL 实现取决于编译器,并且从它继承通常是一个坏主意,所以我不确定如何执行此操作。我使用的编译器是 MSVC (2015)。

我该怎么做?

【问题讨论】:

  • 那你为什么不写一个包装器呢?
  • 因为在发布模式下我希望它是原始的 std::function,所以编写包装器需要我实现 std::function 具有的所有功能。例如:#ifdef _DEBUG using FunctionPointer = DebugFunction; #else using FunctionPointer = std::function; #endif

标签: c++ pointers stl function-pointers std-function


【解决方案1】:
template < typename Signature >
struct function_decorator
{
    template < typename Fun >
    function_decorator(Fun f)
        : fun(f)
    {}

    template < typename ... Pack >
    auto operator()(Pack ... args) const
    {
        return fun(std::forward<Pack>(args)...);
    }

private:
    std::function<Signature> fun;
};

对于一个快速而肮脏的实现,我认为会起作用。

【讨论】:

  • 您可以return fun(std::forward&lt;Pack&gt;(args)...);进行完美转发。
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 2013-05-02
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多