指向成员函数的模板指针 - getter
Template pointer to a member function - getter
所以我正在制作一个排序函数,我希望它根据我给它的 getter 对我的元素进行排序。
问题是我的 getter 是 const
,这就是为什么我当前的代码不起作用。如果我删除 const
它工作得很好。
struct User {
string name;
string getX() const { return name; } //// doesnt work with this
string getX() { return name; } //// this works fine. but i need my getter to be const
};
template <typename ElemType, typename MemberType>
void _sort(std::vector<ElemType>& vec, MemberType(ElemType::* member)(), bool ascending = true)
{
for (int j = 0; j < vec.size() - 1; ++j)
for (int i = 0; i < vec.size() - j - 1; ++i)
if (((vec[i].*member)() < (vec[i + 1].*member)()) ^ ascending)
swap(vec[i], vec[i + 1]);
}
int main()
{
vector<User> a{ User{"Z"}, User{"E"}, User{"B"}, User{"R"}, User{"A"} };
for (auto e : a)
cout << e.name << " ";
cout << endl;
_sort(a, &User::getX);
for (auto e : a)
cout << e.name << " ";
cout << endl;
return 0;
}
我该怎么做才能让它与 const
getter
一起工作
把参数也设为const:
template <typename ElemType, typename MemberType>
void _sort(std::vector<ElemType>& vec, MemberType(ElemType::* member)() const, bool ascending = true)
________________________________________________________________________^^^^^
或者不要使参数如此具体:
template <typename ElemType, typename MemberType>
void _sort(std::vector<ElemType>& vec, MemberType member, bool ascending = true)
如果 getter 不是 const,前者将无法工作,而后者将与任何东西一起工作。如果你向后者传递一个不能像 (vec[i].*member)()
这样调用的函数,那么编译错误将在那里而不是在 _sort
.
的签名中
所以我正在制作一个排序函数,我希望它根据我给它的 getter 对我的元素进行排序。
问题是我的 getter 是 const
,这就是为什么我当前的代码不起作用。如果我删除 const
它工作得很好。
struct User {
string name;
string getX() const { return name; } //// doesnt work with this
string getX() { return name; } //// this works fine. but i need my getter to be const
};
template <typename ElemType, typename MemberType>
void _sort(std::vector<ElemType>& vec, MemberType(ElemType::* member)(), bool ascending = true)
{
for (int j = 0; j < vec.size() - 1; ++j)
for (int i = 0; i < vec.size() - j - 1; ++i)
if (((vec[i].*member)() < (vec[i + 1].*member)()) ^ ascending)
swap(vec[i], vec[i + 1]);
}
int main()
{
vector<User> a{ User{"Z"}, User{"E"}, User{"B"}, User{"R"}, User{"A"} };
for (auto e : a)
cout << e.name << " ";
cout << endl;
_sort(a, &User::getX);
for (auto e : a)
cout << e.name << " ";
cout << endl;
return 0;
}
我该怎么做才能让它与 const
getter
把参数也设为const:
template <typename ElemType, typename MemberType>
void _sort(std::vector<ElemType>& vec, MemberType(ElemType::* member)() const, bool ascending = true)
________________________________________________________________________^^^^^
或者不要使参数如此具体:
template <typename ElemType, typename MemberType>
void _sort(std::vector<ElemType>& vec, MemberType member, bool ascending = true)
如果 getter 不是 const,前者将无法工作,而后者将与任何东西一起工作。如果你向后者传递一个不能像 (vec[i].*member)()
这样调用的函数,那么编译错误将在那里而不是在 _sort
.