c++ - 用于评估指向成员的指针的 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
?请注意,我的编译器不支持自动模板参数。
解决方案
更改方法的顺序并修复“错别字”:
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...);
}
推荐阅读
- r - 从数据表创建列表列表
- scala - SBT 设置范围为交互模式?
- python - 带有数组和密钥对的数据框
- .net - dotnet publish 不会为 Azure Functions 创建 bin 文件夹
- windows-10 - 为什么“英语 - 世界”语言环境与 ISO 8601 完全不同?
- python - 迭代构建 Pandas DataFrame 的最佳方法
- c# - 尝试删除目录中的重复文件时出现 UnauthorizedAccessException
- android - 横向对话框片段未出现
- javers - 有什么方法可以清空 JaversRepository?
- laravel - 仅当用户不在线时如何在网络中推送通知?