c++ - 使用 C++ 模板从成员变量进行接口(interface)转发

标签 c++ templates

怎么说:

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/

相关文章:

c++ - QImage padding - 任何可用的功能?

c++ - GCC 无法使用 init-capture 捕获 'this' 指向模板类型的指针

c++ - 编译器误解了我的代码并向参数添加了额外的 "const"

c++ - 如何检查模板模板参数类型的唯一性?

c++ - 为什么不能将模板函数作为模板模板参数传递?

c++ - 如何根据 c++ 模板中的类型类型执行 if else ?

c++ 从文件开头读取到指定字节

c++ - 如何使用键盘和鼠标输入来导航图形

c++ - 如何避免在基类初始值设定项中调用默认构造函数?

c++ - 是否可以触发由 1 发送触发的 2 接收回调?