Реализация std :: rank для пользовательского типа (собственный класс) - PullRequest
1 голос
/ 21 сентября 2019

Я пытался вызвать std :: rank для пользовательского типа Foo, это не сработало.Теперь я предполагаю, что он работает только с базовым типом, и мне нужно расширить класс Foo, чтобы использовать его.https://en.cppreference.com/w/cpp/types/rank предлагает возможную реализацию.

Я все еще изучаю C ++, и у меня нет большого опыта работы с более сложными темами.Не могли бы вы сказать мне, как я могу добавить std :: rank в Foo?

#include <iostream>
#include <type_traits>

class Foo {   
};

    template<class T>
    struct Foo::rank : public std::integral_constant<std::size_t, 0> {};

    template<class T>
    struct Foo::rank<T[]> : public std::integral_constant<std::size_t, rank<T>::value + 1> {};

    template<class T, std::size_t N>
    struct Foo::rank<T[N]> : public std::integral_constant<std::size_t, rank<T>::value + 1> {};

int main()
{
    Foo foo1[5];
    Foo foo2[5][5];

    std::cout << std::rank<Foo>(foo1);
    std::cout << std::rank<Foo>(foo2);

}

8: 22: ошибка: полное имя не называет класс до ':' токен 8:22: ошибка: ожидается '{' before ':' токен 8:22: ошибка: ожидается неквалифицированный идентификатор до ':' токен 11:17: ошибка: 'rank' не является шаблоном класса 11:27: ошибка: квалифицированное имя не называетсякласс до маркера ':' 11:27: ошибка: ожидается '{' before ':' токен

1 Ответ

2 голосов
/ 21 сентября 2019

Вы ничего не должны делать с std::rank.Все, что вам нужно, это использовать decltype:

Foo foo1[5];
Foo foo2[5][5];

std::cout << std::rank<decltype(foo1)>{}; // 1
std::cout << std::rank<decltype(foo2)>{}; // 2

Live демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...