我有一些关于功能模板的问题。
我的计划是构建一个派生自用户定义类的包装器,不仅导出该类的公共函数,还导出它的构造函数。所以我决定使用多个构造函数模板(我认为它们的工作方式与函数模板完全相同)和 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 来做我想要的,对参数没有任何副作用并且还接受临时变量?
非常感谢!