专用模板,其中包括启用

Specialize template which includes enableif

本文关键字:其中包括 启用 专用      更新时间:2023-10-16

我想专门研究一种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

编辑:我在Foo中添加了IsFancy,但这没有任何区别。

编辑:我正在与MinGW一起编译。但我计划也使用MSVC。

编辑:将IsFancy与接受的答案一起添加到Foo中可以解决问题。

只需使用重载:

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()(

在:

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

在 void 之前删除了 tof 类型名。

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

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

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

并在专业化中 void 之前删除类型名称,就像有人说的那样。