【发布时间】:2016-03-15 09:59:32
【问题描述】:
我知道,我不能在模板中使用 float 作为非类型参数。所以我想为我的极限类使用一个分子和一个分母。
我的限制类得到一个类型以及最小值和最大值。要将 Limit 用于 int 和 float,我目前使用的是:
template <typename U, typename T = U, T A1 = 0, T A2 = 0, T A3 = 0, T A4 = 0>
struct Limit {
static constexpr const U min = A1;
static constexpr const U max = A2;
};
template <intmax_t A1, intmax_t A2, intmax_t A3, intmax_t A4>
struct Limit<float, intmax_t, A1, A2, A3, A4> {
static constexpr const float min = A1 / (float) A2;
static constexpr const float max = A3 / (float) A4;
};
Limit<float, intmax_t, 40, 20, 30, 40> a;
Limit<int, 10, 20> b;
有没有办法优化这个实现?并且也许启用浮动实现的默认值?
提前谢谢你!
编辑:我想要一个像这样的模板声明(不工作):
// For int, char, short, uint32_t etc...
template <typename U, U MIN, U MAX>
struct Limit {
static constexpr const U min = MIN;
static constexpr const U max = MAX;
};
// For float/double
template <typename T /*float or double*/, typename MIN, typename MAX>
struct Limit {
static constexpr const T min = MIN.num / (T) MIN.dem; // static cast...
static constexpr const T max = MAX.num / (T) MAX.dem; // static cast...
};
Limit<int, int, 10, 20> a;
Limit<float, std::ratio<4,5>, std::ratio<10,15>> b;
【问题讨论】:
-
有关这些值范围的一些信息可能会有所帮助。您的另一个选择是通过使用指数而不是分母来“模拟”浮点数 - 两个限制可能相同(因此请求范围)
-
您当前的代码无法编译 (
g++ 5.3.0),因为Limit<int, 10, 20>不是有效的实例化(第二个参数必须是类型)。如果您使用这种方法,您将不得不创建另一个专业化。 -
定义“优化”。
-
定义“不工作”。
标签: c++ templates c++11 template-specialization