2012-03-01 48 views
13

我试图获得基于整数值作为模板类型的专业化。如果我使用一个整数,专业化是直截了当的。是否有可能有一个简单的基于范围的模板专业化而不使用增强基础。基于整数范围的模板专业化

这是代表代码转换为

template <typename int val> 
class Param 
{ 
public: 

}; 

template <> class Param<0 to 100> 
{ 

}; 

template <> class Param<100 to 175> 
{ 

}; 

回答

13

这里是一个(简单)的方式使用SFINAE来实现您的要求:

template<bool> struct Range; 

template<int val, typename = Range<true> > 
class Param 
{}; 

template<int val> 
class Param<val, Range<(0 <= val && val <= 100)> > 
{}; 

template<int val> 
class Param<val, Range<(100 < val && val <= 175)> > 
{}; 

Demo

+0

更好。非常感谢! – Ram 2012-03-01 14:46:45

+0

很酷。虽然真的唯一的区别是你必须在每个模板类上编写'(x 2012-03-01 14:51:54

+1

这个问题现在有两种方法可以为未来的访问者提供帮助。 + 1 btw。 – 2012-03-01 14:58:14

-3

是否有可能有基于一系列简单的模板特不使用提升的基础。

不适用于C++ 03,它非常优雅,简洁,可维护且通用,可轻松指定任意大的范围。为了保持代码简洁,您需要像boost预处理程序库一样来遍历一系列值。

Sans BOOST或重新实现它的大块,你可以创建一些悲伤的小宏来调用特定数量的连续值的初始宏。例如:

#define X(N) template <> class Param<N> { ... }; 
#define X2(N) X(N) X(N+1) 
#define X4(N) X2(N) X2(N+2) 
#define X8(N) X4(N) X4(N+4) 
... 

// template <> class Param<100 to 175> then becomes 
X64(100); // 100..163 
X8(164); // 164..171 
X4(172); // 172..175 

或者,你可以使用一个程序/脚本编写你的C++代码,如较早的编译步骤,有时可以算出更好的 - 有时更糟糕 - 比预处理两轮牛车。

13

您可以使用SFINAEstd::enable_if使自己得心应手的编译时间范围的测试类:

#include <iostream> 
#include <type_traits> 

using namespace std; 

template<int Start, int End, int Val, class Enable = void> 
struct crange { }; 

template<int Start, int End, int Val> 
struct crange<Start, End, Val, typename std::enable_if<Val >= Start && Val <= End>::type> { 
    typedef void enabled; 
}; 

template<int Val, class Enable = void> 
class Param { 
public: 
    Param() : value(422) { } 

    int value; 
}; 

template<int Val>    // V VV the range [x, y] 
class Param<Val, typename crange<0, 10, Val>::enabled> { 
public: 
    Param() : value(1.32) { } 

    double value; 
}; 

int main() { 
    Param<1> pdouble; 
    Param<50> pint; 

    cout << pdouble.value << endl; // prints 1.32 
    cout << pint.value << endl; // prints 422 
} 
+1

塞思,非常感谢。如果有一种方法可以将您的答案标记为有用的多次,那么我将单击该按钮一百次! – Ram 2012-03-01 05:11:55

+2

+1为好答案,但它比需要更复杂。看到我的答案。 – iammilind 2012-03-01 13:21:26