专用模板,包括enableif

时间:2018-01-12 22:56:00

标签: c++ templates template-specialization enable-if

我想专门研究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以及接受的答案就可以了。

3 个答案:

答案 0 :(得分:2)

只需使用过载:

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);
}
感谢SFINAE(template

T::IsFancy()将被排除在外

答案 1 :(得分:1)

在:

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

Gid在void之前删除了tof typename。

答案 2 :(得分:0)

我认为在递归的某个时刻,你到达的地方没有模板可以实例化。 尝试在顶部声明一般模板,首先打破递归,然后完成剩下的工作。有一些奇怪的逻辑,我不太明白,但我会尝试至少编译。我认为在你的情况下,enable_if不在正确的位置。一般来说,它会解决一些设计问题。

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

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

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