由具有任何专业化类型的另一个模板约束模板参数
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;
}
我开始尝试使用模板,并萌生了编写简单 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;
}