专门包含 enableif 的模板

Specialize template which includes enableif

我想专门化一个 templated 方法。它利用 std::enable_if 检查给定类型的静态 属性:

template <class T, bool fancy= T::IsFancy()>
typename std::enable_if<fancy, void>::type
onlyForFancyGuys(T* component) {
    /*stuff*/
    onlyForFancyGuys(component->parent);
}

当我将它用于递归调用时,我需要一种方法来确定递归何时结束。也就是说,当使用类型 Foo 时。所以我尝试了这个专业。

template<>
typename void onlyForFancyGuys<Foo, true>(Foo* component);

template<>
void onlyForFancyGuys<Foo, true>(Foo* component);

但它一直告诉我这个 template-id 不匹配任何模板声明。我在这里做错了什么? enable_if 有什么特别之处吗?

重要事实:Foo 没有方法 IsFancy

编辑:我将 IsFancy 添加到 Foo,但没有任何区别。

编辑:我正在使用 MinGW 进行编译。但我也打算使用 MSVC。

编辑:将 IsFancy 添加到 Foo 以及接受的答案就成功了。

在:

template<>
typename void onlyForFancyGuys<Foo, true>(Foo* component);

Gid 去掉了 void 前的 typename。

我认为在递归的某个时刻,您到达了无法实例化模板的地方。 尝试在顶部声明通用模板,它首先打破递归,然后再做其余的事情。有一些我不太明白的奇怪逻辑,但我至少会尝试编译。我认为 enable_if 在您的情况下不在正确的位置。一般会解决一些设计问题。

template<typename T>
void onlyForFancyGuys(T* t) {
}

 template<typename T, bool b>
    void onlyForFancyGuys(T* t) {
    }

并删除专业化中 void 之前的 typename,就像有人说的那样。

只需使用重载:

void onlyForFancyGuys(Foo* component) { /* ... */ }

template <class T, bool fancy = T::IsFancy()>
typename std::enable_if<fancy, void>::type
onlyForFancyGuys(T* component) {
    /*stuff*/
    onlyForFancyGuys(component->parent);
}

template 将被排除在外感谢 SFINAE(在 T::IsFancy()