我正在编写一个迭代器外观,但看起来我的迭代器甚至会违反基本的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<>
。虽然我想尽可能地推迟它。
我可以制作多个级别的后备,但我找不到比这更好的解决方案。
答案 0 :(得分:1)
有某种方法可以获得这样的类型:
参考并存储在reference_wrapper中。
参考显然是可复制的。
如果您想拥有回调并管理生命周期,请将其存储在shared_ptr中 这增加了许多开销,但它只是有效。