专用模板,其中包括启用
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
。
编辑:我在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 之前删除类型名称,就像有人说的那样。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 为什么 cmake 许可证<>样式不包括?
- OpenGL在启用深度测试时不会丢弃我的碎片
- 计算平均值,不包括上次得分
- Visual C++GC接口如何启用它以及要包含哪个库
- 从多个源构造一个对象,包括一个对象向量
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 如何在自定义类中启用'auto loops'?
- 根据某个函数是否存在启用模板
- 其中降频广播实际上是有用的
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 在编译中包括 Botan 2
- 使用 A 类,其中包括 B 类中的 B 类
- 专用模板,其中包括启用
- 生成从 1 到 1000 的卡拉奇特系列的程序,其中包括数字和字母
- 我在哪里可以找到arm-linux-gneabihf-ld的手册页,更不用说写得很好的手册页了,其中包括-rpath和-
- 未解决的内容包括在Eclipse CDT中,其中路径名不确定
- Cpp文件包括,同时也可以在其中调试