代码之家  ›  专栏  ›  技术社区  ›  Neil G

用C++模板实现成员变量的接口转发

  •  0
  • Neil G  · 技术社区  · 15 年前

    我怎么说:

    template<typename T>
    class X {
      // if T has method x(), define
      //   Y x() { return t.x() }
    
      T t;
    };
    
    1 回复  |  直到 15 年前
        1
  •  3
  •   Ben Voigt    15 年前

    定义一下。

    如果 X::x 那就不叫了 T::x X::X 被称为 不存在,错误消息将指向 . 大多数编译器都会使用这样的措辞:“未知标识符 x Y X<Something>::x(void) 在此背景下: 无论是什么,只要调用X::X()来表示一个不支持它的东西

    编辑:因为你使用C++ 0x,所以无论如何都要使用DECKTYPE:

    template<typename T>
    class Forwards {
         T t;
    public:
        decltype(this->t.x()) x() { return this->t.x(); }
    };
    

    我不能百分之百确定是否使用 decltype(T::x()) decltype(t.x()) ,或 decltype(this->t.x()) ,但我很确定这应该管用。如果 t ,然后 Forwards::x() 函数将无法实例化。这仍然不是完美的转发,因为您需要事先知道参数列表,但现在可以处理返回类型的变化。