如何包装可呼叫以使其定期类型

How to wrap Callable to make it regular type?

本文关键字:类型 呼叫 何包装 包装      更新时间:2023-10-16

我正在编写迭代器外观,但是我的迭代器似乎甚至会违反基本的Iterator概念。问题在于迭代器接受任何Callable,这可能会在形成的常规类型上产生基本操作。我遵循亚历山大·史蒂芬诺夫(Alexander Stepanov)提出的定义。这是声明:

template<typename Callable, typename Iterator>
class transform_iterator 

问题:如何包装可呼叫以使其定期类型?

实际上我需要包装器才是:

  • 复制构造

  • 复制可分配

  • 可破坏性

,通常不是常规类型。

我的第一次尝试:包装到std::optional<>

template <typename T>
class regular_box
{
    std::experimental::optional<T> value;
public:
//constructors, operator=
    template <typename ... ArgTypes>
    auto operator()(ArgTypes&& ... args)
    {
        return callable.value()(std::forward<ArgTypes>(args)...);
    }
};

,但它不能解决分配的问题,因为如果Callable不可副本可分配,则regular_box也将无法复制。

计划B std::function<>。尽管我想尽可能将其推迟。

我可以做出多个级别的后备,但是我找不到比这更好的解决方案。

有某种方法可以得到这样的类型:

  1. 请参考并存储在Reference_wrapper中。
    参考显然是可以构造的。

  2. 如果要拥有回调并管理寿命,请将其存储在shared_ptr。
    这增加了许多开销,但它只是有效的。