由具有任何专业化类型的另一个模板约束模板参数

Constraing template parameter by another template with any specialization type

我开始尝试使用模板,并萌生了编写简单 header-only 单元库的想法。我遇到了在参数类型上定义约束的问题。类型本身也是一个模板。我的要求是将类型约束为任何模板专业化类型 'Prefix' 的类型 'Meter'。我希望下面的代码能说明一切,非常感谢您提出任何建议。

template<int PrefixVal>
struct Prefix { 
    constexpr int getVal() { return PrefixVal;}
};

struct Micro : public Prefix<-1000000>{};
struct Milli : public Prefix<-1000>{};

template<class PrefixType>
class Meter {
 public:
    Meter(double v) : val(v) {}
    template<class AnyMeterType>
    Meter operator+(const AnyMeterType& meter){
        // How to constrain AnyMeterType to be 
        // type Meter<AnyPrefix>?
    }  
  private:
    double val;
};

int main()
{
    Meter<Micro> d1{1000};
    Meter<Milli> d2{1};
    Meter<Milli> d3 = d2 + d1;

    // d3.val == 2

    return 0;
}   

你可以这样做:

template<class OtherPrefixType>
Meter operator+(const Meter<OtherPrefixType>& meter) { ... }

我创建了临时对象以在 Prefix 中使用 getVal() 函数。 在这里,我的解决方案,

#include <iostream>

template<int PrefixVal>
struct Prefix { 
    constexpr int getVal() { return PrefixVal;}
};

struct Micro : public Prefix<-1000000>{};
struct Milli : public Prefix<-1000>{};

template<class PrefixType>
class Meter {
 public:
    Meter(double v) : val(v) {}
    template<class AnyMeterType>
    Meter operator+(const Meter<AnyMeterType>& meter){
        return PrefixType{}.getVal()*val + AnyMeterType{}.getVal()*meter.getVal();
    }  

    friend std::ostream& operator<<(std::ostream &os, const Meter &m)
    {
        os << m.val;
        return os;
    }

    double getVal() const
    {
        return val;
    }

  private:
    double val;
};

int main()
{
    Meter<Micro> d1{1000};
    Meter<Milli> d2{1};
    Meter<Milli> d3 = d2 + d1;

    // d3.val == 2
    std::cout << d3;
    return 0;
}