我已经定义了自己的布尔类型
template<bool b>
struct Bool {
constexpr static bool value = b;
};
using True = Bool<true>;
using False = Bool<false>;
我正在尝试获取类似Eq类的haskell Bool实例。
template<typename T>
struct Eq {
template<typename R>
struct equal;
template<typename R>
struct notEqual {
using value = typename not_<typename equal<T, R>::value>::value;
};
};
我想知道如何对“相等”类进行专业化处理。更清楚地说,我想要这样的东西:
template<bool a>
template<bool b>
struct Eq<Bool<a>>::equal<Bool<b>> {
using value = typename std::conditional<a == b, True, False>::type;
};
有解决方案吗?我试图做到这一点:
template<bool a>
struct Eq<Bool<a>>::equal<Bool<a>> {
using value = True;
};
但是编译器告诉我“'mtp::Eq<T>::equal
':模板参数过多”。谢谢您的帮助。
答案 0 :(得分:0)
您不能专注于诸如Bool<a>
之类的从属模板。以下将起作用:
template<typename T>
template<bool b>
struct Eq<T>::equal<Bool<b>> {
using value = /* ... */;
};
您可以使用std::enable_if_t
来确保T
是Bool
,并使用另一个模板来提取该Bool
类型的值。
答案 1 :(得分:0)
如果要部分Eq<Bool<a>>::equal<Bool<b>>
进行专业化,则必须分几部分进行:
template <bool b>
struct Eq<Bool<b>> {
template<typename R>
struct equal;
template<typename R>
struct notEqual {
using value = typename not_<typename equal<T, R>::value>::value;
};
};
然后
template<bool a>
template<bool b>
struct Eq<Bool<a>>::equal<Bool<b>> {
using value = typename std::conditional<a == b, True, False>::type;
};