将通用模板类作为仿函数参数传递

时间:2015-01-30 19:44:17

标签: c++ c++11 stl iterator corba

我想改进以下代码段:

THNNetIPInfoIter last = std::unique(fist, end, HNInfoIPComparator());

当前HNInfoIPComparator()的实施方式如下:

// equal comparator
class HNInfoIPComparator
{
    public:
      bool operator()(const THNNetIPInfo &a, const THNNetIPInfo &b);
      bool operator()(const SDK::TIPAddressDescription &a, const SDK::TIPAddressDescription &b);
      bool operator()(const THNNetIPInfo &a, const SDK::TIPAddressDescription &b);
      bool operator()(const SDK::TIPAddressDescription &a, const THNNetIPInfo &b);
};

这个比较器定义的原因是它可能与其他STL算法一起使用,例如std::set_difference,并且应该处理范围具有不同类型的情况。

问题在于我必须编写大量非常相似的比较器,并且很容易与使用哪个比较器纠缠在一起。

我想写下以下代码:

template<typename SDKClass, typename IDLClass>
class equal {
public:
  bool operator()(const IDLClass &a, const IDLClass &b) {
      if (strcmp(a.ipaddr.in(), b.ipaddr.in())) {
          return false;
      }
      return true;
  }

  bool operator()(const SDKClass &a, const SDKClass &b) {
      if (strcmp(a.ip_address().c_str(), b.ip_address().c_str())) {
          return false;
      }
      return true;
  }

  bool operator()(const IDLClass &a, const SDKClass &b) {
      if (strcmp(a.ipaddr.in(), b.ip_address().c_str())) {
          return false;
      }
      return true;
  }

  bool operator()(const SDKClass &a, const IDLClass &b) {
      if (strcmp(a.ip_address().c_str(), b.ipaddr.in())) {
          return false;
      }
      return true;
  }
};

因此HNInfoIPComparator()会生成std::unique,具体取决于在std::unique函数内作为参数传递的类型。

因此我想传递给// Automatically generated structure from IDL specification // Basically simple structure struct THNNetIPInfo { typedef THNNetIPInfo_var _var_type; typedef THNNetIPInfo_out _out_type; static void _tao_any_destructor (void *); ::TAO::String_Manager ipaddr; ::TAO::String_Manager netmask; }; // THNNetIPInfoIter - class external iterator // which was written manually typedef Util::CorbaSeqIter<THNNetIPInfoList, THNNetIPInfo> THNNetIPInfoIter; // THNNetIPInfoList - also automatically generated class // from IDL specification, list of THNNetIPInfo elements THNNetIPInfoList list(...); THNNetIPInfoIter first(&list, 0); THNNetIPInfoIter end(&list, list.length()); 模板化仿函数(类)。有可能这样做吗?

我还想处理functor包含一些内部数据的情况,这些内部数据用于比较

最重要的代码示例:

{{1}}

1 个答案:

答案 0 :(得分:2)

不是使用四个比较运算符编写类模板,而是使用模板化比较运算符编写一个普通类,该运算符将输入调整为您要比较的键:

class HNInfoIPComparator {
    static const char* adapt(const THNNetIPInfo& t) {
        return t.ipaddr.in();
    }

    static const char* adapt(const SDK::TIPAddressDescription& t) {
        return t.ip_address().c_str();
    }

public:
    template <typename T, typename U>
    bool operator()(const T& t, const U& u) const {
        return !strcmp(adapt(t), adapt(u));
    }
};

您可以通过为其他类型添加adapt的重载来轻松扩展比较器,例如std::stringconst char*