【发布时间】:2011-07-15 06:29:20
【问题描述】:
我有一些关于函数模板的问题。
我的计划是构建一个派生自用户定义类的包装器,并且 不仅导出该类的公共函数,还导出其构造函数。 所以我决定我会使用多个构造函数模板(我认为它们完全可以工作 与函数模板相同)具有 1 到 n 个参数,以满足大多数构造函数的需求。
这些不会只是简单地调用构造函数然后做其他事情,比如 这个:
template <class T>
class Wrapper : public T
{
public:
template <class U>
Wrapper(U &u) : T(u) { doSomething(); }
template <class U, class V>
Wrapper(U &u, V &v) : T(u,v) { doSomething(); }
...
};
我的意图是在 Wrapper-Ctor 的其他地方注册实例,并且, 从那时起,它可以接收对 T 中定义的虚函数的调用。
我不得不在上面的代码中使用引用运算符,以保证 我的 Wrapper-Ctor 对传递的参数没有任何副作用 (复制构造)。
令我惊讶的是,这总是有效的,除了临时工,这就是为什么 我对编译器在这种情况下推断的类型感到困惑。 为了简化情况,我尝试通过模板函数做类似的事情:
template <class T>
void foo(T &t)
{
int x = ""; // intentional error
}
这样调用函数:
std::string a;
std::string &b = a;
foo(b);
令我惊讶的是,编译器在其错误消息中表示 [T = std::string]。 我本来希望这是 [T = std::string&],这会导致 传递一个引用到引用,这是无效的。
那么,为什么编译器会在这种情况下推导出值类型呢? 是否有可能创建一个可以做我想要的 Wrapper-Ctor,不 对参数有任何副作用并且还接受临时变量?
非常感谢!
【问题讨论】:
-
为了干净利落地做你想做的事,你需要完美的转发或继承构造函数,C++03 都不支持,但在 C++0x 中会支持。
标签: c++ templates function types inference