我可以指定或选择类的成员(并将其用作参数)吗?
Can I specify or select a member of a class (and use it as parameter )?
例如,假设我有:
class AB { float a,b; };
如何编写一个可以根据传入的参数以"正确"的方式处理a
或b
的函数?我想做这样的事情:
float getSqrt(AB x, ClassMemberSelector s)
{ return sqrt(x.s); }
AB x;
getSqrt(x, SelectClassMember(AB::a) ); //get square root of x.a
getSqrt(x, SelectClassMember(AB::b) ); //get square root of x.b
当然,这里有三个例子:
1(
float getSqrt(const AB& ab, function<float(const AB&)> selector)
{
return sqrt(selector(ab));
}
简化为(感谢内森奥利弗的评论(:
template<typename SelectorT>
float getSqrt(AB ab, SelectorT selector)
{
return sqrt(selector(ab));
}
(这个版本更好,因为它避免了将lambda复制到std::function
(
和用法(两个版本相同(:
cout << getSqrt(x, [](const AB& ab) { return ab.a; }) << endl;
cout << getSqrt(x, [](const AB& ab) { return ab.b; }) << endl;
2(
另一种可能性是使用指向成员的指针:
float getSqrt(const AB& ab, float AB::*selector)
{
return sqrt(ab.*selector);
}
和用法:
cout << getSqrt(x, &AB::a) << endl;
cout << getSqrt(x, &AB::b) << endl;
3(
还有一个使用 TMP 特征样重载选择的示例:
struct SelectAMemberT {};
struct SelectBMemberT {};
template<typename SelectorT>
float getSqrt(const AB& ab, SelectorT);
template<>
float getSqrt(const AB& ab, SelectAMemberT)
{
return sqrt(ab.a);
}
template<>
float getSqrt(const AB& ab, SelectBMemberT)
{
return sqrt(ab.b);
}
const SelectAMemberT SelectAMember;
const SelectBMemberT SelectBMember;
和用法:
cout << getSqrt(x, SelectAMember) << endl;
cout << getSqrt(x, SelectBMember) << endl;
#include <iostream>
#include <cmath>
class AB
{
public:
float a, b;
};
float getSqrt(AB x, float AB::*mem)
{
return sqrt(x.*mem);
}
int main()
{
AB x;
x.a = 9;
x.b = 16;
std::cout << "sqrt x.a: " << getSqrt(x, &AB::a) << std::endl;
std::cout << "sqrt x.b: " << getSqrt(x, &AB::b) << std::endl;
system("pause");
return 0;
}
相关文章:
- 如何使用默认参数等选择模板专业化
- 对可变参数使用声明.如何选择正确的功能
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 使模板函数按函数参数选择类型
- 根据模板参数选择宏定义
- 使用 std::条件根据模板参数选择成员类型
- 根据 C++11 中的模板参数选择数组大小
- 为什么 lambda 自动和参数选择常量重载?
- 如何使用模板参数选择方法调用
- 如何根据参数选择变量
- 根据函数参数选择派生类
- 如何根据模板参数选择替代成员函数实现
- 使用mpl::if_和integer模板参数选择类型
- 根据模板参数选择合适的复制构造函数
- 参数选择的问题
- 通过模板参数选择子类与实例化成员变量的区别
- 根据模板整数参数选择一个整数类型
- 根据模板参数选择枚举类型
- 根据模板参数选择函数名称
- 根据模板参数选择联合成员