在一系列成员变量上调用运算符
Calling an operator over a series of members variables
我正在寻找一种方法来调用一系列成员变量的运算符。我的目标是将对每个变体的引用数量减少到恰好 1。下面的 MWE 说明了我所拥有的以及我正在努力实现的目标。
有效的 c++1z:
template<typename... Args> bool all(Args... args) { return (args && ...); }
struct foo {
std::string m1;
std::string m2;
int m3;
double m4;
bool compare(const foo& rhs) const {
return all(m1 == rhs.m1, m2 == rhs.m2, m3 == rhs.m3, m4 == rhs.m4);
}
}
我想实现的是更多的形式:
...
return all<*this, rhs>(m1, m2, m3, m4);
第二种形式的确切语法无关紧要。但是我不是在寻找宏或“只是写 {return *this == rhs;} 答案。如果可以避免,则无需使用现代功能。
您可以将它的指针传递给成员。
template <typename T_, typename... Ts_>
bool all(const T_* p1, const T_* p2, Ts_... ptrs)
{
bool b []{ (p1->*ptrs == p2->*ptrs)... };
for (int x = 0; x < sizeof...(Ts_); ++x)
{
if (!b[x])
return false;
}
return true;
}
struct foo
{
std::string m1;
std::string m2;
int m3;
double m4;
bool compare(const foo& rhs) const
{
return all(this, &rhs, &foo::m1, &foo::m2, &foo::m3, &foo::m4);
}
};
循环是从我的头顶跳出来的,但我确信有更好的方法来检查所有的比较。
我正在寻找一种方法来调用一系列成员变量的运算符。我的目标是将对每个变体的引用数量减少到恰好 1。下面的 MWE 说明了我所拥有的以及我正在努力实现的目标。
有效的 c++1z:
template<typename... Args> bool all(Args... args) { return (args && ...); }
struct foo {
std::string m1;
std::string m2;
int m3;
double m4;
bool compare(const foo& rhs) const {
return all(m1 == rhs.m1, m2 == rhs.m2, m3 == rhs.m3, m4 == rhs.m4);
}
}
我想实现的是更多的形式:
...
return all<*this, rhs>(m1, m2, m3, m4);
第二种形式的确切语法无关紧要。但是我不是在寻找宏或“只是写 {return *this == rhs;} 答案。如果可以避免,则无需使用现代功能。
您可以将它的指针传递给成员。
template <typename T_, typename... Ts_>
bool all(const T_* p1, const T_* p2, Ts_... ptrs)
{
bool b []{ (p1->*ptrs == p2->*ptrs)... };
for (int x = 0; x < sizeof...(Ts_); ++x)
{
if (!b[x])
return false;
}
return true;
}
struct foo
{
std::string m1;
std::string m2;
int m3;
double m4;
bool compare(const foo& rhs) const
{
return all(this, &rhs, &foo::m1, &foo::m2, &foo::m3, &foo::m4);
}
};
循环是从我的头顶跳出来的,但我确信有更好的方法来检查所有的比较。