我在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;
}
};
答案 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;
}
};
根据算法部分的不同,这可能有意义,也可能没有意义。