专门包含 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()
)
我想专门化一个 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()
)