怎么说:
template<typename T>
class X {
// if T has method x(), define
// Y x() { return t.x() }
T t;
};
最佳答案
只需定义它。
如果X::x
没有被调用,那么T::x
也不一定存在。如果X::x
被称为 T::x
不存在,错误消息将指向使用 X::x
.大多数编译器会使用类似这样的措辞:“未知标识符 x
在此上下文中编译 Y X<Something>::x(void)
时:对于不支持它的东西调用的任何 X::x()” .
编辑:因为您使用的是 C++0x,所以一定要使用 decltype:
template<typename T>
class Forwards {
T t;
public:
decltype(this->t.x()) x() { return this->t.x(); }
};
我不是 100% 确定是否使用 decltype(T::x())
, decltype(t.x())
, 或 decltype(this->t.x())
,但我很确定这应该有效。如果t
不提供 x
, 然后是 Forwards::x()
函数将无法被实例化。这仍然不是完美的转发,因为您需要先验地知道参数列表,但现在您可以处理返回类型的变化。
关于c++ - 使用 C++ 模板从成员变量进行接口(interface)转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3088987/