我有一个类的大数据成员,它只用于测试:
template <bool testing>
class foo {
int testbuf[1000];
}
我怎么能这样做?仅当testing
为true
时,请包含testbuf[]
?
答案 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.
});
}
但那只是我。