c – 当模板化类不包含可用的成员函数时,如何在编译时验证模板参数?

前端之家收集整理的这篇文章主要介绍了c – 当模板化类不包含可用的成员函数时,如何在编译时验证模板参数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个以下模板化的结构:
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 }; 
};

编辑:没有无限递归.

// 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> {};
原文链接:https://www.f2er.com/c/117165.html

猜你在找的C&C++相关文章