powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::array получение индекса элемента по его значению
5 сообщений из 5, страница 1 из 1
std::array получение индекса элемента по его значению
    #40021728
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Предположим, что существует известный во время компиляции массив уникальных значений, представленных в виде 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
std::array получение индекса элемента по его значению
    #40021730
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему бы не скопипастить реализацию с заголовков С++20?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::array получение индекса элемента по его значению
    #40021731
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, забыл, еще есть вопрос:

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

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

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


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