C ++如何使模板化代码更清晰

时间:2014-04-17 14:31:39

标签: c++ templates

我在C ++中使用高度模板化的代码,代码让我发疯,因为我经常不得不乱用这样的可憎行为:

std::pair<typename P<A, B>::const iterator, std::pair<long, typename P<A, B>::const_iterator> p;

(没有C ++ 11 for tuple)

和此:

template <A, B, C, D, E>
class MyClass {
  private:
    P <A, B> p;
    Q <C, D> q;
    // (does nothing with A, B, C, D but has to use the template because
    // this class uses other templated classes P<A, B> and Q<C, D>)
    // ...
};

有没有办法让代码更清晰,更易读,比如使用typedef或其他技巧?

编辑: 将P和Q视为std :: maps,我不知道其类型。

以下是我的代码如何工作

template<A, B, C, D>
class MapWrapper {
  private:
    std::map< map<A, B>::const_iterator, map<C, D>::const_iterator > _map;

  public:
    void insert_in_map (map<A, B>::const_iterator one, map<C, D>::const_iterator two) {
        _map[one] = two;
    }
};

1 个答案:

答案 0 :(得分:2)

一种选择是将其重写为

template <class P, class Q>
class MyClass {
  private:
    P p;
    Q q;
};

而是使用像

MyClass<A, B, C, D, E>

将其更改为

MyClass<P<A, B>, Q<C, D>>

这一点,正确使用typedef,可能减少样板量。

另一种选择是通过应用某种类型擦除来支付运行时性能(即使用较少的模板)。

编辑:在编辑之后,在您的具体代码中,您可以推广您的类以使用任何迭代器对:

template<class I1, class I2>
class MapWrapper {
  private:
    std::map<I1, I2> _map;

  public:
    void insert_in_map (I1 one, I2 two) {
        _map[one] = two;
    }
};

根据算法部分的不同,这可能有意义,也可能没有意义。