C++ 在一系列成员变量上调用运算符

C++ 在一系列成员变量上调用运算符,c++,reflection,metaprogramming,C++,Reflection,Metaprogramming,我正在寻找一种方法来调用一系列成员变量上的运算符。我的目标是将每个变量的引用数减少到正好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; b

我正在寻找一种方法来调用一系列成员变量上的运算符。我的目标是将每个变量的引用数减少到正好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);
  }
}
template bool all(Args…Args){return(Args&&…)}
结构foo{
std::字符串m1;
std::字符串m2;
int m3;
双m4;
布尔比较(常量foo和rhs)常量{
返回全部(m1==rhs.m1,m2==rhs.m2,m3==rhs.m3,m4==rhs.m4);
}
}
我想要实现的是更多的形式:

...
return all<*this, rhs>(m1, m2, m3, m4);
。。。
返回全部(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);
    }
};
模板
布尔全部(常数T_*p1、常数T_*p2、Ts_*ptrs)
{
bool b[]{(p1->*ptrs==p2->*ptrs)…};
对于(int x=0;x

循环是我脑海中突然出现的东西,但我相信有更好的方法来检查所有的比较。

使用
tup!e::tie
似乎是一个好方法。如果您可以定义一个成员函数,使用
tie
将要比较的元素作为引用的元组,那么您可以在两个这样的元组之间进行比较免费。太好了,谢谢。我没想到你可以像那样扩展参数包。我最后用std::all_of测试结果。