在 C++11 中,我希望只有在选择了默认模板值的情况下才在类中有一个成员变量和一个用于初始化的构造函数(当然,仅适用于 int 等受支持的类型)。
有什么推荐的方法来实现这一点(允许提升)?
就像是:
template< int _x = -1 > struct C {
C() {} // only available if _x != -1
C( int x ) : x( x ) {} // only available if _x == -1
// more methods that are common for all _x and refer to _x / x
private:
int x; // only available if _x == -1
// more members that are common for all _x
};
或者,换一种说法:对于大小和速度优化,如果选择了模板默认值以外的其他值,我想使用编译时间常数而不是存储在成员变量中的值。
--
这是一个使一切更清晰的示例:
template< int _size = -1 > struct Block {
Block() { buf = mmap( _size, ... ); } // exists only when size!=-1
Block( int s ) { buf = mmap( size = s, ... ); } // exists only when size==-1
~Block() { munmap( buf, getSize() ); } // should use the correct size
int getSize() const { return ???; } // gets _size if !=-1, size otherwise
// other methods that use buf and getSize()
private:
void *buf;
const int size; // only exists for size == -1!
};
这部分解决了它:
template< int _x > struct X {
int getX() const { return _x; }
};
template<> struct X< -1 > {
X( x ) : x( x ) {}
int getX() const { return _x; }
private:
int x;
};
template< int _x = -1 > struct C : X< _x > {
C() {} // only available if _x != -1
C( int x ) : X< _x >( x ) {} // only available if _x == -1
// more methods that are common for all _x and use this->getX()
};
但是 的构造函数C
呢,还有其他/更好的解决方案吗?