Почему я не могу добавить слой абстракции с поиском типов для удаления ссылок в C ++? - PullRequest
0 голосов
/ 12 декабря 2018

Это своего рода дополнительный вопрос к

Почему я не могу использовать черты с переадресацией ссылок в 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 это ссылка.Если это соответствует, то ссылка удаляется, и мы надеемся получить совпадение.Но это не похоже на работу.Есть ли способ исправить это, чтобы сохранить дух моей попытки?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

NB, вы также можете сделать это без 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> {};
0 голосов
/ 12 декабря 2018

Вы неправильно используете 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>

живой пример на godbolt.org

...