C ++可变参数模板以评估指向成员的指针

时间:2019-03-09 00:25:07

标签: c++ templates variadic-templates pointer-to-member

我想创建一个可变参数模板,用于评估指向成员的嵌套指针。我尝试了以下方法:

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 = outer'
  注意:'U = outer :: inner'
  注意:'V = {int external :: inner :: *}'

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

1 个答案:

答案 0 :(得分:1)

更改方法的顺序并修复“ typos”:

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