声明后在模板类中对嵌套模板类进行特化

时间:2019-07-01 10:25:29

标签: c++ templates metaprogramming

我已经定义了自己的布尔类型

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':模板参数过多”。谢谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您不能专注于诸如Bool<a>之类的从属模板。以下将起作用:

template<typename T>
template<bool b>
struct Eq<T>::equal<Bool<b>> {
    using value = /* ... */;
};

您可以使用std::enable_if_t来确保TBool,并使用另一个模板来提取该Bool类型的值。

live example on godbolt

答案 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;
};

Demo