如何包装可呼叫以使其定期类型
How to wrap Callable to make it regular type?
我正在编写迭代器外观,但是我的迭代器似乎甚至会违反基本的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<>
。尽管我想尽可能将其推迟。
我可以做出多个级别的后备,但是我找不到比这更好的解决方案。
有某种方法可以得到这样的类型:
-
请参考并存储在Reference_wrapper中。
参考显然是可以构造的。 -
如果要拥有回调并管理寿命,请将其存储在shared_ptr。
这增加了许多开销,但它只是有效的。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 错误:类型"std::__1::basic_string<char>"不提供呼叫运算符
- 使用makeword函数创建错误e0109-表观呼叫的括号前表达式必须具有(指针到 - )函数类型
- 为什么此函数通过类型函数指针调用后,呼叫明智地行为
- C 呼叫功能具有许多不同类型
- 如何专门针对size_t以外的返回类型来专业呼叫操作员
- 我可以将持有的类型从std ::变体中更改为从呼叫到std ::访问
- 如何包装可呼叫以使其定期类型
- 表达在明显呼叫的括号前表达式必须具有(指针到 - )函数类型
- 为什么C 标准要求编译器忽略对基本类型转换操作员的呼叫
- 没有适当操作员()的类型对象的呼叫
- 当我知道类型时,如何避免虚拟呼叫
- 类型不提供呼叫运算符