【问题标题】:Calling an operator over a series of members variables在一系列成员变量上调用运算符
【发布时间】:2016-02-24 23:25:44
【问题描述】:

我正在寻找一种通过一系列成员变量调用运算符的方法。我的目标是将每个变体的引用数量减少到恰好 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;} 答案。如果可以避免,则无需使用现代功能。

【问题讨论】:

  • 使用tup!e::tie 似乎是个不错的选择。如果您可以使用tie 定义一个将要比较的元素作为引用元组返回的成员函数,您可以免费获得两个这样的元组之间的比较。

标签: c++ reflection metaprogramming


【解决方案1】:

您可以将它的指针传递给成员。

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);
    }
};

我的脑海中突然出现了一个循环,但我确信有更好的方法来检查所有比较。

【讨论】:

  • 完美,谢谢。我没有想到您可以像这样扩展参数包。我最终使用 std::all_of 来测试结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多