C ++:使用模板中的两个相同类型名构造海峡
C++: Construct strait with two same typenames from template
我是 C++ 的新手,我正在尽力构建这样的东西:
enum class Unit { km, m, cm };
template<int v, Unit u>
struct Measure {
static const int value = v;
static const Unit unit = u;
};
template<typename Measure, typename Measure>
struct Measures_same {
static const bool value(const Measure m1, const Measure m2) {
return m1.unit == m2.unit;
}
};
我的目标是我可以像这样调用我的特征:
Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value
,这会 return 错误。
显然我不允许在模板中两次定义相同的类型名(模板),但我不确定我应该怎么做。如果我删除其中之一,参数的数量将不再匹配。
我该如何进行?
提前致谢!
Measure_same
需要使用两个不同的模板参数。如果类型相同,value
的 return 值将始终为 true
。使用:
template<typename Measure1, typename Measure2>
struct Measures_same { ... };
您不需要对 Measure_same::value
进行任何输入。只需使用:
template<typename Measure1, typename Measure2>
struct Measures_same {
static const bool value() {
return Measure1::unit == Measure2::unit;
}
};
使用函数调用从 Measure_same
获取 value
。使用:
Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value()
例如:
std::cout << std::boolalpha << Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value() << std::endl;
您可以使用模板专业化和来自 type_traits
的一些帮助
基本模板(始终为 false):
template<class...>
struct Measures_same : std::false_type{};
具有相同 Unit
参数的两个 Measures
类 的特化:
template<int v, Unit u, int w>
struct Measures_same<Measure<v, u>, Measure<w, u>> : std::true_type{};
像这样使用它:
static_assert(Measures_same<Measure<1, Unit::km>, Measure<2, Unit::km>>::value, "Fail");
static_assert(!Measures_same<Measure<1, Unit::m>, Measure<1, Unit::km>>::value, "Fail2");
我是 C++ 的新手,我正在尽力构建这样的东西:
enum class Unit { km, m, cm };
template<int v, Unit u>
struct Measure {
static const int value = v;
static const Unit unit = u;
};
template<typename Measure, typename Measure>
struct Measures_same {
static const bool value(const Measure m1, const Measure m2) {
return m1.unit == m2.unit;
}
};
我的目标是我可以像这样调用我的特征:
Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value
,这会 return 错误。 显然我不允许在模板中两次定义相同的类型名(模板),但我不确定我应该怎么做。如果我删除其中之一,参数的数量将不再匹配。
我该如何进行?
提前致谢!
Measure_same
需要使用两个不同的模板参数。如果类型相同,value
的 return 值将始终为true
。使用:template<typename Measure1, typename Measure2> struct Measures_same { ... };
您不需要对
Measure_same::value
进行任何输入。只需使用:template<typename Measure1, typename Measure2> struct Measures_same { static const bool value() { return Measure1::unit == Measure2::unit; } };
使用函数调用从
Measure_same
获取value
。使用:Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value()
例如:
std::cout << std::boolalpha << Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value() << std::endl;
您可以使用模板专业化和来自 type_traits
基本模板(始终为 false):
template<class...>
struct Measures_same : std::false_type{};
具有相同 Unit
参数的两个 Measures
类 的特化:
template<int v, Unit u, int w>
struct Measures_same<Measure<v, u>, Measure<w, u>> : std::true_type{};
像这样使用它:
static_assert(Measures_same<Measure<1, Unit::km>, Measure<2, Unit::km>>::value, "Fail");
static_assert(!Measures_same<Measure<1, Unit::m>, Measure<1, Unit::km>>::value, "Fail2");