我有一些关于函数模板的问题。函数模板参数的类型扣除
我的计划是构建一个派生自用户定义的类的包装,并且不仅导出该类的公共函数,还导出其构造函数。 所以我决定使用多个构造函数模板(我认为它的功能与函数模板完全相同)使用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(); }
...
};
我的意图是从该点上的包装,构造函数别的地方内注册的实例,并 ,它可以接收对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将支持这两种构造函数。 – 2011-03-14 22:30:20