我正在开发一个基于模板的库以支持定点整数,我想出了这个类,现在我必须测试INT_BITS
和FRAC_BITS
的各种值。但由于它们是const
(并且由于某种原因它们必须是这样),我无法在循环中初始化具有变量INT_BITS
的对象,因此它正在测试此库非常困难。 />
template<int INT_BITS, int FRAC_BITS>
struct fp_int
{
public:
static const int BIT_LENGTH = INT_BITS + FRAC_BITS;
static const int FRAC_BITS_LENGTH = FRAC_BITS;
private:
// Value of the Fixed Point Integer
ValueType stored_val;
};
我尝试了很多提及here,here和here的技巧。我尝试使用std::vector
const int
和const_cast
,但似乎没有任何效果。
我想知道你如何测试这样的库,其中模板参数是一个大的测试值的const?
答案 0 :(得分:2)
您可以使用模板元编程来模拟for循环。
#include <iostream>
typedef int ValueType;
template<int INT_BITS, int FRAC_BITS>
struct fp_int
{
public:
static const int BIT_LENGTH = INT_BITS + FRAC_BITS;
static const int FRAC_BITS_LENGTH = FRAC_BITS;
private:
// Value of the Fixed Point Integer
ValueType stored_val = 0;
};
template <unsigned int N> struct ForLoop
{
static void testFpInt()
{
std::cout << "Testing fp_int<" << N << ", 2>\n";
fp_int<N, 2> x;
// Use x
// Call the next level
ForLoop<N-1>::testFpInt();
}
};
// Terminating struct.
template <> struct ForLoop<0>
{
static void testFpInt()
{
std::cout << "Testing fp_int<" << 0 << ", 2>\n";
fp_int<0, 2> x;
// Use x
}
};
int main()
{
ForLoop<10>::testFpInt();
return 0;
}
输出
Testing fp_int<10, 2>
Testing fp_int<9, 2>
Testing fp_int<8, 2>
Testing fp_int<7, 2>
Testing fp_int<6, 2>
Testing fp_int<5, 2>
Testing fp_int<4, 2>
Testing fp_int<3, 2>
Testing fp_int<2, 2>
Testing fp_int<1, 2>
Testing fp_int<0, 2>
您可以通过搜索“for loop using template metaprogramming”在网上找到更多信息。