9

基本上我希望我的范围类型可以隐式转换Range<const char>Range<const unsigned char>. std::enable_if 似乎是不可能的,因为该函数没有参数并且没有返回。解决方法是什么?

这基本上是我尝试过的:

template<typename T>
class Range{
    T* begin_;
    T* end_;
public:
    Range(T* begin,T* end):begin_{begin},end_{end}{}
    template<int N>
    Range(T (&a)[N]):begin_{static_cast<T*>(&a[0])},end_{static_cast<T*>(&a[N-1])}{}
    T* Begin(){return begin_;}
    T* End(){return end_;}
    operator typename std::enable_if<std::is_same<T,const char>::value,Range<const unsigned char>&>::Type (){
        return *reinterpret_cast<Range<const unsigned char>*>(this);
    }
};
4

1 回答 1

16

使其成为具有默认为 T 的虚拟参数的模板 - 这是将类型推导推迟到函数被实例化的点,否则 SFINAE不起作用。然后你在另一个参数的默认值中做你想要的检查。

template<
    typename U = T,
    typename = typename std::enable_if< std::is_same<U,const char>::value >::type
>
operator Range<const unsigned char>() {
    return *reinterpret_cast<Range<const unsigned char>*>(this);
}
于 2013-08-07T10:46:04.850 回答