用于评估指向成员的指针的 C++ 可变参数模板
C++ Variadic Template to Evaluate 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 中编译上面的代码时,出现以下错误消息:
error C2672: 'getField': no matching overloaded function found
error C2893: Failed to specialize function template 'unknown-type getField(T &, U T::* ,V...)'
note: With the following template arguments:
note: 'T=outer'
note: 'U=outer::inner'
note: 'V={int outer::inner::* }'
如何修复上述可变参数模板进行编译,return p.in.val
?请注意,我的编译器不支持自动模板参数。
更改方法的顺序并修复 "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...);
}
我想创建一个可变模板来计算指向成员的嵌套指针。我尝试了以下方法:
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 中编译上面的代码时,出现以下错误消息:
error C2672: 'getField': no matching overloaded function found
error C2893: Failed to specialize function template 'unknown-type getField(T &, U T::* ,V...)'
note: With the following template arguments:
note: 'T=outer'
note: 'U=outer::inner'
note: 'V={int outer::inner::* }'
如何修复上述可变参数模板进行编译,return p.in.val
?请注意,我的编译器不支持自动模板参数。
更改方法的顺序并修复 "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...);
}