c ++中的安全整数转换

Fra*_*ger 1 c++ templates

我想使用c ++模板创建一个简单的整数范围检查器和转换器.
代码如下所示:

// D is the "destination" type and S the "source" type
template <class D, class S>
inline D SafeConvert( S value );

template <class S>
inline int SafeConvert<int>( S value ) {

    ASSERT( value >= S(INT_MIN) && value <= S(INT_MAX) );
    return int(value);
} /// error C2768: 'SafeConvert' : illegal use of explicit template arguments


template <class S>
inline size_t SafeConvert<size_t>( S value ) {

    ASSERT( value >= S(0) && value <= S(size_t(-1)) );
    return size_t(value);
} /// error C2768: 'SafeConvert' : illegal use of explicit template arguments


// ...

void test() {

    size_t v = INT_MAX+1;
    int iv = SafeConvert<int>(v);
}
Run Code Online (Sandbox Code Playgroud)

但是我有以下编译错误:

error C2768: 'SafeConvert' : illegal use of explicit template arguments
Run Code Online (Sandbox Code Playgroud)

我的问题是如何告诉编译器我只想专门研究D类?

谢谢.

Edw*_*nge 5

您不能部分专门化功能模板.您需要使用类包装器模仿它或使用标准函数重载.模仿的一个例子:

template <typename T1, typename T2>
struct processor;

template < typename T1, typename T2 >
T1 fun(T2 t2) { return processor<T1,T2>::apply(t2); }

template < typename T2 >
struct processor<int,T2>
{
   static int apply(T2 t2) { .... }
};

...etc...
Run Code Online (Sandbox Code Playgroud)