【问题标题】:Pass generic template class as functor parameter将通用模板类作为函子参数传递
【发布时间】:2015-01-30 19:44:16
【问题描述】:

我想改进以下代码sn-p:

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,并且应该在范围具有不同类型时处理大小写。

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

我想写如下sn-p:

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 模板仿函数(类)。是否有可能做到这一点以及如何做到这一点?

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

最重要的代码示例:

// 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());

【问题讨论】:

  • 创建一个可以从THNNetIPInfoTIPAddressDescription 隐式转换的HNInfoIP 类型是否可行?这会将HNInfoIPComparator 上的运算符重载减少到一个。
  • 您是否查看过 CORBA 的 IDL 到 C++11 语言映射,该映射更易于使用,将大大简化比较器函数的实现。
  • 是的,我知道映射到 C++11 的新 CORBA 版本。但是,不幸的是,我找不到任何旧 TAO Corba 的免费替代品。你知道任何?我只找到了TAOX11,但它需要付费。
  • TAOX11 是目前据我所知的唯一实现,它是具有开发者许可的商业产品,不像 TAO 那样免费。

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


【解决方案1】:

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

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*

【讨论】:

  • 但是当我需要相同的operator() 但在另一个类成员上时,这种方法还需要生成多个比较器。 Fox 示例我必须为adapt 编写具有相同类型的HNNetMaskComparator,但在return t.netmask.in()HNInfoInterface 中使用return.interface.in()。我想要更通用的东西,比如equal,对于这个调用equal(THNNetIPInfo, netmask),它会自动生成正确的运算符return !strcmp(t.netmask.in(), u.netmask.in())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2017-06-14
  • 1970-01-01
相关资源
最近更新 更多