Я играю с идеей, которая может показаться искаженной, но мне нравится вызов, хотя я просто придумал это упражнение на C ++.
Задача состоит в том, чтобы хранить серию n скаляров в d измерениях.Представьте, что у вас есть вектор, матрица или трехмерная матрица из n , удваивается, или целое число, или что-то еще, и выбираете, сколько их во время выполнения (вычисляется вручную, ничего сложного).
Скажем, например, я бы хотел, чтобы массив 1D длиной 4
из двух двойных (n == 2
, d == 1
, во время выполнения я говорю, что хочу хранилище 4
):
| d0 d1 | d0 d1 | d0 d1 | d0 d1 |
Или 2D 2x4
сетка из 3-х двойных (n == 3
, d == 2
, во время выполнения я говорю, что хочу хранилище 2 * 4
):
| d0 d1 d2 | d0 d1 d2 | d0 d1 d2 | d0 d1 d2 |
| d0 d1 d2 | d0 d1 d2 | d0 d1 d2 | d0 d1 d2 |
Какнапример, я получаю доступ к i, j
-ому элементу сетки?Конечно, с оператором ... но я хотел бы написать одиночный оператор , возвращающий кортеж ссылок трем типам двойных чисел.
Чтобы получитьидея:
template <std::size_t n, std::size_t d, typename Number>
class storage
{
public:
// Magic tricks here?
auto operator()(std::size_t i_0, ..., std::size_t i_d) -> std::tuple<n std::ref<Number>s>
{
}
};
Проблема в том, как я могу сыграть здесь некоторые магические трюки с шаблонами, чтобы определить один оператор, который возвращает кортеж однородных типов ?
Мне особенно трудно думать о том, как определить этот кортеж, и, конечно, об операторе, который должен иметь ровно d параметров.
Что касается использования, я 'я хотел бы иметь возможность работать следующим образом, например, в 2D-примере:
// define a matrix of three doubles
storage<3, 2, double> storageobj(8);
// get a block, these should be references
auto block = storageobj(0, 1);
std::get<0>(block) = -123.456;
Обратите внимание, что фактическая реализация доступа к элементам в памяти сейчас не имеет для меня значения, но определениетипы возврата и как сделать operator()
основной целью этого упражнения.
Может ли какая-то магическая ТМП помочь здесь?