c++ - 为什么我不能添加一个带有类型查找的抽象层来去除 C++ 中的引用?
问题描述
这是一个后续问题
已正确回答。但是我在下面尝试了自己的解决方案
#include <type_traits>
template <typename T, typename enable = void> struct Traits {
static const bool value = false;
};
template <typename T> struct Traits<T,std::enable_if<std::is_reference<T>::value>> {
static const bool value = Traits<typename std::remove_reference<T>::type>::value;
};
struct Zip{};
template <> struct Traits<Zip,void> {
static const bool value = true;
};
template <typename E>
void Execute(E && e){
static_assert(Traits<E>::value);
}
int main(){
auto z = Zip();
Execute(z);
}
该理论是,如果正确的专业化失败,那么下一个最专业化的将是基于 ifT
是参考匹配的专业化。如果匹配,则引用被剥离,我们递归希望得到匹配。但这似乎不起作用。有没有办法解决这个问题,保持我的尝试精神?
解决方案
你在滥用std::enable_if
. 如所写,您的Traits
结构是专门针对std::enable_if
其自身的,而不是针对其结果的。您需要访问嵌套::type
类型别名:
typename std::enable_if<std::is_reference<T>::value>::type
// or
std::enable_if_t<std::is_reference<T>::value>
推荐阅读
- python - Pandas DataFrame.sort_index() 在排序数据上的性能可以提高吗?
- spring-integration - RecipientListRouter 执行顺序
- json - 使用 json 模式验证器根据有效负载中另一个字段的值验证 EAV 有效负载中某些键的存在
- django - 如何遍历 Django 模板中的多个字段?
- corda - 具有 OneToMany 映射的 LinearState
- javascript - 如何离线查看一个简单的 create-react-app 组件?
- go - 初始化从 XML 创建的嵌套匿名结构到结构转换器
- php - 有人通过 PayPal 捐款时如何更新捐款栏?
- java - 如何使用方法、数组和循环从代码中删除字符串?
- django - 带参数的 Django 管理器