模板参数,#定义和代码重复

我有很多这样的代码:

#define WITH_FEATURE_X

struct A {
#ifdef WITH_FEATURE_X
  // ... declare some variables Y
#endif
  void f ();
};

void A::f () {
  // ... do something
#ifdef WITH_FEATURE_X
  // ... do something and use Y
#else
  // ... do something else
#endif
  // ... do something
}

我想用模板参数替换#define:

template < int WITH_FEATURE_X > // can be 0 or 1
struct A;

但是我不想为A <0> :: f()和A <1> :: f()几乎重复A :: f()的所有代码,只需要几行依赖于参数的行。 我也不想调用函数而不是以前的#ifdefs。 什么是常用解决方案?


我相信你想要的是与D语言中存在的“static if”命令等价的东西。 恐怕C ++中不存在这样的特性。

请注意,如果部分代码因请求的功能而异,则这些部分不属于主函数,因为它们不是裸算法的一部分。 因此,在功能中委派这些功能的选项看起来很不错。

编辑
如果您的#ifdef语句用于以不同的方式执行相同的子任务,那么定义子功能是正确的。 它会使你的代码更具可读性,而不是更少。

如果他们用于完全不同的行为,那么你的代码已经混乱了。 做点什么吧。

至于您担心可能出现的性能问题,请相信您的编译器。

EDIT2
我忘了提到代码第一部分的答案:根据“功能”使用以下技巧添加或删除成员。

namespace helper
{
  template<int feature>
  struct A;

  template<>
  struct A<0> { // add member variables for case 0 };

  template<>
  struct A<1> { // add member variables for case 1 };
}

template<int feature>
class A : private helper::A<feature>
{
  // ... functions here
};

如果你想避免重复函数f的逻辑,你可以使用模板方法模式(不,不是那种类型的template

template <bool enabled>
class helper {
protected:
    void foo() { /* do nothing */ }
};

template <>
class helper<true> {
protected:
    Y y;
    void foo() { /* do something with y */ }
};

struct A : private helper<WITH_FEATURE_X> {
    void f() {
        // common stuff

        foo(); // optimized away when WITH_FEATURE_X is false

        // more common stuff
    }
};

常见的解决方案,只是使用#ifdef恐怕。 :-)

链接地址: http://www.djcxy.com/p/2593.html

上一篇: template parameters, #define and code duplication

下一篇: Using .NET/Mono on Linux to serve a high volume web service, a good idea?