为什么我不能添加一个带有类型查找的抽象层来剥离 C++ 中的引用?
Why can't I add a layer of abstraction with type lookup to strip references in 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);
}
理论是,如果正确的专业化失败,那么下一个最专业化的将是根据 T
是否为参考匹配的专业化。如果匹配,则引用被删除,我们递归希望得到匹配。但这似乎不起作用。有没有办法解决这个问题,保持我的尝试精神?
您在滥用 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>
N.B。你也可以在没有 enable_if
的情况下进行(看起来更干净,IMO):
template <typename> struct Traits {
static const bool value = false;
};
template <typename T>
struct Traits<T&> : Traits<T> {};
template <typename T>
struct Traits<T&&> : Traits<T> {};
这是
的后续问题已正确回答。但是我在下面尝试了自己的解决方案
#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);
}
理论是,如果正确的专业化失败,那么下一个最专业化的将是根据 T
是否为参考匹配的专业化。如果匹配,则引用被删除,我们递归希望得到匹配。但这似乎不起作用。有没有办法解决这个问题,保持我的尝试精神?
您在滥用 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>
N.B。你也可以在没有 enable_if
的情况下进行(看起来更干净,IMO):
template <typename> struct Traits {
static const bool value = false;
};
template <typename T>
struct Traits<T&> : Traits<T> {};
template <typename T>
struct Traits<T&&> : Traits<T> {};