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

评估成员指针的C++可变模板

  •  0
  • Jeff G  · 技术社区  · 5 年前

    我想创建一个变量模板,用于计算指向成员的嵌套指针。我尝试了以下方法:

    template<typename T, typename U, typename... V>
    auto getField(T &input, U (T::*field), V... args)
        -> decltype(getField(input.*field, &args...))
    {
        getField(input.*field, &args...);
    }
    
    template<typename T, typename U>
    U getField(T &input, U (T::*field))
    {
        return input.*field;
    }
    
    struct inner {
        int val;
    };
    
    struct outer {
        inner in;
    };
    
    void main() {
        outer p{{5}};
        cout << getField(p, &outer::in, &inner::val) << endl;
    }
    

    当我在vs中编译上述内容时,会收到以下错误消息:

    错误C2672:“GetField”:未找到匹配的重载函数
    错误C2893:未能专用化函数模板“unknown type getfield(t&,u t::*,v…)”
    注意:使用以下模板参数:
    注:‘t=外层’
    注意:“U=外部::内部”
    注意:“v=int outer::inner::*”

    如何修复上述变量模板进行编译并返回 p.in.val ?注意,我的编译器不支持自动模板参数。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Jarod42    5 年前

    更改方法顺序并修复“拼写错误”:

    template<typename T, typename U>
    U getField(T &input, U (T::*field))
    {
        return input.*field;
    }
    
    template<typename T, typename U, typename... V>
    auto getField(T &input, U (T::*field), V... args)
        -> decltype(getField(input.*field, args...))
    {
        return getField(input.*field, args...);
    }
    

    Demo