如 Mehrdad 所示,C++11 引入了转发。
在 C++03 中,您可以尝试使用模板 ala:
template <typename T>
class Wrapper
{
public:
Wrapper() { }
template <typename T1>
Wrapper(const T1& t1) : t_(t1) { }
template <typename T1. typename T2>
Wrapper(const T1& t1, const T2& t2) : t_(t1, t2) { }
template <typename T1. typename T2, typename T3>
Wrapper(const T1& t1, const T2& t2, const T3& t3) : t_(t1, t2, t3) { }
...
private:
T t_;
};
因为在调用函数之前不会检查所有错误,所以使用占位符来表示比T
当前支持的更多的参数是可以的。
您可以使用预处理器宏为通常充足但不是疯狂数量的参数生成此类转发函数。您可能会或可能不会发现使用 boost 预处理器库更容易做到这一点。
虽然这在简单的情况下通常就足够了,但这并不是一个通用的解决方案。具体来说——当你想传递一个非const
参数时。你可以:
const
不在参数列表中,但非const
引用不能绑定到临时对象,因此调用者不能在准备参数值时使用很多普通表达式,或者
- 接受
const
引用然后抛弃const
-ness,但这消除了语言的故意保护功能,并可能允许尝试更改真正的const
变量,包括例如字符串文字 - 导致未定义的行为。