c ++大数据成员仅用于测试

时间:2012-11-09 22:25:41

标签: c++ templates

我有一个类的大数据成员,它只用于测试:

template <bool testing>
class foo {
  int testbuf[1000];
}

我怎么能这样做?仅当testingtrue时,请包含testbuf[]

4 个答案:

答案 0 :(得分:3)

专营:

template <bool> class foo { };

template <> class foo<true>
{
    // everything needed for testing
};

更新:澄清评论中提出的一些观点:您会为每个编写一个您想要专门化的“测试”模板,这样就没有了代码重复。想象一下,您的真实班级模板实际上是bar

template <bool Testing>
class bar
: private foo<Testing>          // specializable base
{
    // common stuff

    Widget<Testing> widget;     // specializable member

    Gadget          gadget;     // unconditional member
};

你也可以使用合成而不是继承;哪个最合适。如果继续使用继承,请务必拼出this->testbuf

答案 1 :(得分:1)

你可以使用ifdef的东西

#define DEBUG_MODE

class Foo{
  #ifdef DEBUG_MODE
      int testbuf[1000];
  #else
      int testbuf[10];
  #endif
}

答案 2 :(得分:0)

template <bool testing>
class foo {
}

template <>
class foo <true>{
  int testbuf[1000];
}

答案 3 :(得分:0)

我将假设testing不仅仅用于持有该buff。

template <bool testing>
struct foobuf
{};
template <>
struct foobuf<true>
{
  enum {testbuf_size = 1000};
  int testbuf[testbuf_size];
  foobuf() { std::fill_n( &testbuff[0], testbuf_size, int() ); }
};

template <bool testing>
class foo : public foobuf<testing> {
  // ...
};

进一步说,你可以在foobuf中加入一个像这样工作的dotest函数:

template<bool>
struct foobuf
{
  template<typename Func>
  void doTest( Func const& unused );
};
template<>
struct foobuf<true>
{
  enum {testbuf_size = 1000};
  int testbuf[testbuf_size];
  foobuf() { std::fill_n( &testbuf[0], testbuf_size, int() ); }
  template<typename Func>
  void doTest( Func const& f )
  {
    f( testbuf, testbuf_size );
  }
};

你会在foo中使用这个:

void foo::some_function(...)
{
  // some code
  doTest( [&]( int* buf, size_t length )
  {
    // the code in here only runs if we test was true in foo
    // and if so, it has access to the test buff via the buf* parameter
    // oh, and it will be almost certainly inlined if test was true in foo
    // and thrown away and never created if it was false.
  });
}

但那只是我。