Это своего рода дополнительный вопрос к
Почему я не могу использовать черты с переадресацией ссылок в C ++?
, на которые дан правильный ответ.Тем не менее, я попробовал свое собственное решение ниже
https://godbolt.org/z/X7dBz1
#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
это ссылка.Если это соответствует, то ссылка удаляется, и мы надеемся получить совпадение.Но это не похоже на работу.Есть ли способ исправить это, чтобы сохранить дух моей попытки?