Что я могу использовать, чтобы сделать функцию, принять N количество аргументов, где N не известно во время программирования, но фиксируется во время компиляции (это параметр шаблона, на самом деле)?Высокопроизводительное решение для принятия N аргументов и возврата значений N
Функция, о которой идет речь, - это функция доступа, которая лежит в критическом пути производительности, поэтому я ищу наименьшие издержки.
Первое, что приходит в голову, это std::initializer_list
, и, хотя мне, как мне сказали, по-прежнему остается ненужный объект для создания и копирования. Более того, у него есть забавный способ получить доступ к своим элементам с помощью initializer_list::begin[i]
(это еще один объект, который мне не нужен) и не ограничивает количество аргументов N точно, но это незначительная жалоба.
Во-вторых, существуют пакеты параметров шаблонов. Могут ли они быть жизнеспособным кандидатом? Я должен использовать рекурсию для доступа к значениям N.
Что я и добиваюсь я попытался показать в этом псевдо-коде:
template<int dim, class T> class linear_searchspace {
template<T...args> operator() (args) {
return std::tie(some_kinda_structure[args[0]], some_kinda_structure[args[1]], some_kinda_structure[args[3]]);
}
};
Hoow я мог привести его в рекурсивной форме, которая будет работать actualy?
КЛАССИФИКАЦИЯ:args
должны быть координатами. Каждая координата является индексом значения в измерении. Таким образом, пройдут N координат, будут возвращены значения N. Это похоже на доступ к N векторам одновременно. Я хотел бы добавить смещение к каждому аргументу, который зависит от индекса аргумента, поскольку он хранит массив с индексом смещения, соответствующим индексу аргумента. Расчет будет простой арифметикой.
И какой будет подходящий тип возврата? Структура, к которой он будет обращаться, скорее всего, будет содержать числовые значения, не более, чем кортежи. Является ли std::tuple
лучшим, что я могу сделать, или это возможно сделать что-то более совершенное?
Что касается аргументов, все идет, даже макросы. Я был бы очень рад услышать, какие трюки вы придумали на протяжении многих лет.
Это зависит в значительной степени от того, как вы используете 'arg s'. –
Непонятно, что вы хотите вернуть из функции? Может быть, вектор в порядке, чем initializer_list - ваш друг – Ation
C++ 11 или C++ 14? – Columbo