如何将Callable包装成常规类型?

时间:2017-03-08 11:35:58

标签: c++ template-meta-programming c++17 regular-type

我正在编写一个迭代器外观,但看起来我的迭代器甚至会违反基本的Iterator概念。问题是迭代器接受任何Callable,这可能会对常规类型生成基本操作。我正在遵循Alexander Stepanov的定义presented。这是宣言:

template<typename Callable, typename Iterator>
class transform_iterator 

问题:如何将callable包装成常规类型?

其实我只需要包装:

  • 复制可构建

  • 复制可分配

  • 可破坏

而不是普通类型。

我的第一次尝试:换入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也不会是可复制的。{/ p>

计划B std::function<>。虽然我想尽可能地推迟它。

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

1 个答案:

答案 0 :(得分:1)

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

  1. 参考并存储在reference_wrapper中。
    参考显然是可复制的。

  2. 如果您想拥有回调并管理生命周期,请将其存储在shared_ptr中 这增加了许多开销,但它只是有效。