代码之家  ›  专栏  ›  技术社区  ›  Neil G

我如何使一个类的接口匹配两倍,但在哪些模板上可以专门化?

  •  0
  • Neil G  · 技术社区  · 14 年前

    如何使接口与double匹配,但模板化类型不动态强制转换为double的类?

    原因是我有一个运行时类型的系统,我希望能够有一个像double一样工作的类型:

    template<int min_value, int max_value>
    class BoundedDouble: public double {};
    

    然后使用模板专门化获取关于该类型的运行时信息:

    template<typename T>
    class Type { etc. }
    
    template<int min_value, int max_value>
    class Type<BoundedDouble<min_value, max_value>> { int min() const { return min_value; } etc. }
    

    但是,你不能从双重继承…

    1 回复  |  直到 14 年前
        1
  •  1
  •   John Dibling    14 年前

    不能从本机类型派生。改为使用合成:

    #include <cstdlib>
    #include <string>
    #include <stdexcept>
    #include <iostream>
    using namespace std;
    
    template<typename Type = double, const Type& Min = -10.0, const Type& Max = 10.0> class Bounded
    {
    public:
        Bounded() {};
        Bounded(const Type& rhs) : val_(rhs) 
        { 
            if(rhs > Max || rhs < Min) 
                throw logic_error("Out Of Bounds"); 
        }
    
        operator Type () const 
        { 
            return val_; 
        }
    
        Type val_;
    };
    
    
    int main()
    {
        typedef Bounded<double, -10.0, 10.0> double_10;
        double_10 d(-4.2);
        cout << "d = " << d << "\n";
        double d_prime = d;
        cout << "d_prime = " << d_prime << "\n";
        double_10 d2(-42.0);
        cout << "d2 = " << d << "\n";
    
    
        return 0;
    }
    

    输出是:

    d = -4.2
    d_prime = -4.2