【发布时间】:2012-12-31 20:02:00
【问题描述】:
假设我们有一个 Box 类如下:
struct Base {}
template<typename T>
struct Box : Base
{
template<typename... Args>
Box(Args&&... args)
: t(forward<Args>(args)...)
{}
T t;
}
然后我们有一个函数 MakeBox:
template<typename X>
Base* MakeBox(X&& x)
{
return new Box<???>(forward<X>(x));
}
X 类型是从调用 MakeBox 时使用的参数推导出来的。
然后我们需要从 X 以某种方式计算出适当的“存储类型”参数 T。
我想如果我们只是天真地使用:
return new Box<X>(forward<X>(x));
那么这将导致问题。
明明std::bind和std::function需要处理这些问题,他们是怎么做的?
std::decay 在这里有用吗?
【问题讨论】:
-
std::remove_reference<X>不是您要找的吗? -
@jogojapan:这就是
std::bind用来存储绑定参数的东西吗? -
std::decay正是您想要的。 -
所以是
return new Box<decay<X>::type>(forward<X>(x))?std::decay文档说“这是按值传递时应用于所有函数参数的类型转换。”。我不确定我完全理解这意味着什么。 -
问题是关于
bind是如何工作的以及它使用了哪些辅助函数(这显然取决于实现),还是关于如何处理代码中的情况?