首页 > 解决方案 > 用于评估指向成员的指针的 C++ 可变参数模板

问题描述

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

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:无法专门化函数模板“未知类型 getField(T &, UT::*,V...)”
注意:使用以下模板参数:
注意: 'T=outer'
注意:'U=outer::inner'
注意:'V={int outer::inner::* }'

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

标签: c++templatesvariadic-templatespointer-to-member

解决方案


更改方法的顺序并修复“错别字”:

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...);
}

演示


推荐阅读