使用模板代替预处理器?

时间:2015-08-27 03:46:57

标签: c++ templates design-patterns

有两个类,大多数代码都相同。

template<typename T>
class A1 {
f1(){common code... do_with(_m) ... common code}
f2();
fn();
T _m;
};

template<typename T>
class A2 {
f1(){common code... do_with(_m, _b) ... common code}
f2();
fn();
B _b;
std::atomic<T*> _m;
};

因为95%的代码是相同的,我想把这两个类合二为一,但我不能使用预处理器,因为它们都将在一个项目中使用。而且因为这两个类是模板,所以我不能使用&#34;模板方法&#34;设计模式将相同的代码提取到基类中,并将一些私有虚函数留给派生类来覆盖。

是否可以避免代码重复?例如:

A<T, type_a1> a1;
A<T, type_a2> a2;

我考虑过模板专业化,但是它不能支持&#34;提取代码的公共部分&#34;,专门的类必须重写整个函数

1 个答案:

答案 0 :(得分:0)

方法1

template <typename T>
void common_f1_pre(T& t) { ... }

template <typename T>
void common_f1_post(T& t) { ... }

在A1:

f1(){common_f1_pre(_m);  do_with(_m); common_f1_post(_m); }

在A2:

f1(){common_f1_pre(_m);  do_with(_m, _b); common_f1_post(_m); }

方法2

template <typename A>
void common_f1(A& a)
{
  // Common to A1 and A2  ... }

  a.f1_core();

  // Common to A1 and A2 
}

在A1:

f1(){f1_common(*this);}
f1_core() {do_with(_m);}

在A2:

f1(){f1_common(*this);}
f1_core() {do_with(_m, _b);}