我有以下模板struct
:
template<int Degree>
struct CPowerOfTen {
enum { Value = 10 * CPowerOfTen<Degree - 1>::Value };
};
template<>
struct CPowerOfTen<0> {
enum { Value = 1 };
};
其使用方式如下:
const int NumberOfDecimalDigits = 5;
const int MaxRepresentableValue = CPowerOfTen<NumberOfDecimalDigits>::Value - 1;
// now can use both constants safely - they're surely in sync
现在模板需要Degree
为非负数。我想为此强制执行编译时断言。
我怎么做?我尝试添加一个析构函数CPowerOfTen
:
~CPowerOfTen() {
compileTimeAssert( Degree >= 0 );
}
但由于它不是直接调用的,Visual C++ 9 决定不实例化它,因此根本不评估编译时断言语句。
我如何强制执行编译时检查Degree
是非负的?
template<bool> struct StaticCheck;
template<> struct StaticCheck<true> {};
template<int Degree>
struct CPowerOfTen : StaticCheck<(Degree > 0)> {
enum { Value = 10 * CPowerOfTen<Degree - 1>::Value };
};
template<>
struct CPowerOfTen<0> {
enum { Value = 1 };
};
Edit:没有无限递归。
// Help struct
template<bool, int> struct CPowerOfTenHelp;
// positive case
template<int Degree>
struct CPowerOfTenHelp<true, Degree> {
enum { Value = 10 * CPowerOfTenHelp<true, Degree - 1>::Value };
};
template<>
struct CPowerOfTenHelp<true, 0> {
enum { Value = 1 };
};
// negative case
template<int Degree>
struct CPowerOfTenHelp<false, Degree> {}
// Main struct
template<int Degree>
struct CPowerOfTen : CPowerOfTenHelp<(Degree >= 0), Degree> {};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)