Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::array получение индекса элемента по его значению / 5 сообщений из 5, страница 1 из 1
24.11.2020, 13:20
    #40021728
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::array получение индекса элемента по его значению
Всем привет!

Предположим, что существует известный во время компиляции массив уникальных значений, представленных в виде std::array.
Я пытаюсь написать мета-функцию, при помощи которой я мог бы получить индекс элемента по его значению в этом массиве.
Cделать это тоже нужно в compile-time.

В С++20 c этим нет проблем, т.к. там имеются библиотечные constexpr find/find_if и все прекрасно работает (проверял).
Но поскольку в VS2019 С++20 на постоянку еще не завезли я пытаюсь провернуть аналогичный трюк под С++17, но застрял.

Пока получилось вот такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
#include <array>

using size_t = unsigned long long;

enum E_KEY { UNKNOWN = -1, ONE = 2, TWO, THREE, FOUR };

template <size_t Total>
using param_key_array = std::array<E_KEY, Total>;

static constexpr auto keys_v = param_key_array<4>{ONE, TWO, THREE, FOUR};

template <E_KEY key, size_t total, size_t i = total - 1>
struct index_of
{
	constexpr index_of(const param_key_array<total>& paramKeys) noexcept : value(paramKeys[i]) {}

	E_KEY value;
};

template <E_KEY key, size_t total>
struct index_of<key, total, total>
{
	constexpr index_of(const param_key_array<total>& paramKeys) noexcept : value(UNKNOWN) {}

	E_KEY value;
};

int main()
{
    constexpr auto i = index_of<ONE, keys_v.size(), 1>(keys_v).value;
    return i;    
}


В чем проблема: пограничные случаи (конец/начало массива) написал, но затупил на том как мне написать специализацию для случая перебора элементов, которая бы прокручивала массив и сравнивала значения.

Как обычно и бывает: стоит только потратить время и вывалить вопрос на форум и тут же решение найду сам.
На это и рассчет


Но если кто-то предложит решение, тоже будет неплохо godbolt

--------------------------------------------------------------
o(O_O)o
...
Рейтинг: 0 / 0
24.11.2020, 13:24
    #40021730
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::array получение индекса элемента по его значению
А почему бы не скопипастить реализацию с заголовков С++20?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.11.2020, 13:24
    #40021731
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::array получение индекса элемента по его значению
да, забыл, еще есть вопрос:

почему не работает CTAD для аргумента total указываемого в конструкторе и компилятор заставляет меня прописывать sizeof(array) вручную все время?

Вроде же он достаточно прост для определения компилятором?
...
Рейтинг: 0 / 0
24.11.2020, 13:25
    #40021733
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::array получение индекса элемента по его значению
Dimitry Sibiryakov
А почему бы не скопипастить реализацию с заголовков С++20?.

тоже думал об этом, но сналету не удалось расковырять что там и как, сейчас буду пробовать еще раз
...
Рейтинг: 0 / 0
24.11.2020, 14:40
    #40021748
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::array получение индекса элемента по его значению
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::array получение индекса элемента по его значению / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]