【发布时间】:2021-08-04 16:48:48
【问题描述】:
通过重新绑定变量为泛型类型重用堆内存。
我想做的事:
template <typename T> //unconstrained type
//...
{
//in some complex procedural logic
T rebindable = .../*r-value*/;
//...
//some procedure dependent case:
T rebindable = .../*different r-value*/; //rebind (I am aware this does not work)
}
为什么这是一个值得一问的问题:
许多过程算法在其范围内维护并持续对内存进行操作。 有时,完全替换其中一个值在逻辑上是必要的,在编程上这意味着解构和构造,可能是不确定的次数(重新绑定)。
通常,这可以通过利用迭代来克服,例如在可能无法分配的数字类型上实现 smart-bisection root finder。
但是,一些更复杂的过程算法可能无法在功能上轻松编写,尤其是在重新绑定由过程状态决定的情况下。
因此,以编程方式实现重新绑定对于通用算法可能非常有用。
不满意的答案
(这绝不是对任何人或其答案的攻击)
Unique_ptr:
template <typename T> //still unconstrained (which is a plus)
//...
{
auto ptr = std::unique_ptr<T>{.../*dangling reference (T*)*/};
//...
ptr = std::unique_ptr<T>{.../*different dangling reference*/};
}
这样解决了不限制类型,但是使用的内存不是堆内存的问题。
作业:
template <typename T>
requires std::assignable_from<T, T> //type constraint!
//...
{
T assignable = .../*r-value*/;
//...
assignable = .../*different r-value*/;
}
虽然这是在堆上,但它是以限制类型为代价的。
新展示位置:
template <std::copy_constructible T> //type constraint!
//...
{
T assignable = .../*r-value*/;
//...
assignable.~T();
new (&assignable) T {.../*different r-value*/};
}
通过重新解构和重新构造赋值 new 值被反弹,但是这仍然有一个关联的类型约束。
【问题讨论】:
-
@mark_s 请停止编辑我的问题以满足您的个人格式要求。
标签: c++ generics memory-management binding value-type