基于整数范围的模板专业化

Ram*_*Ram 15 c++ templates

我试图将基于整数值的特化作为模板类型.如果我使用单个整数,专业化是直截了当的.是否可以在不使用boost基础的情况下基于范围进行简单的模板专业化.

这是代表性的代码转换为

template <typename int val>
class Param
{
public:

};

template <> class Param<0 to 100>
{

};

template <> class Param<100 to 175>
{

};
Run Code Online (Sandbox Code Playgroud)

iam*_*ind 16

以下是使用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)> >
{};
Run Code Online (Sandbox Code Playgroud)

演示.


Set*_*gie 14

您可以使用SFINAE以std::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
}
Run Code Online (Sandbox Code Playgroud)

  • 获得良好答案的+1,但它比需要的要复杂得多.看我的回答. (2认同)