Я бы хотел использовать частичную специализацию шаблонов, чтобы «разбить» массив (который создается во время компиляции) на пакет параметров, состоящий из его значений (для взаимодействия с другими структурами, которые я определил в своем коде). Следующее (моя первая попытка) не компилирует
#include <array>
template <typename T, auto k> struct K;
template <typename T, std::size_t... A> struct K<T, std::array<std::size_t, sizeof...(A)>{A...}> {};
, потому что аргумент шаблона std::array<long unsigned int, sizeof... (A)>{A ...}
не должен включать параметры шаблона . Насколько я понял, невозможно обеспечить параметры не-типа в частичной специализации шаблона, если они нетривиально зависят от параметров шаблона. Поэтому я попытался обойти эту проблему, указав значение в виде:
#include <array>
template <auto f> struct any_type;
template <typename T, typename array_wrapper> struct FromArr;
template <typename T, std::size_t... A>
struct FromArr<T, any_type<std::array<std::size_t, sizeof...(A)>{A...}>> {};
int main() {
FromArr<int, any_type<std::array<std::size_t, 2>{1, 2}>> d;
(void) d;
}
Однако здесь, частичная специализация шаблона завершается неудачно, когда я пытаюсь его использовать; приведенное выше определение не соответствует тому, как я его использую, и я не уверен, почему. Сбой со следующей ошибкой:
file.cc: In function ‘int main()’:
file.cc:10:55: error: aggregate ‘FromArr<int, Any<std::array<long unsigned int, 2>{std::__array_traits<long unsigned int, 2>::_Type{1, 2}}> > d’ has incomplete type and cannot be defined
10 | FromArr<int, Any<std::array<std::size_t, 2>{1, 2}>> d;
Можно ли обойти это / использовать другой подход для интерфейса массива как пакета параметров?
Использованный компилятор
Я использую g++-10.0 (GCC) 10.0.1 20200124 (experimental)
и компилирую с помощью g++ -std=c++2a file.cc
, c ++ 2a требуется, потому что я использую нетипичные параметры шаблона.
Редактировать:
Описание того, как массив должен быть обработанным
В моем реальном коде у меня есть структура, которая зависит, среди прочего, от пакета параметров (1). Было бы неплохо, если бы я мог использовать массив (2) (который я получил в другой части моего кода в качестве аргумента шаблона нетипичного типа) для взаимодействия с этой структурой, как показано в коде ниже.
template <int... s> struct toBeUsed; // (1)
template <std::size_t s, std::array<int, s> arr> struct Consumer { // (2)
toBeUsed<arr> instance; // This is what I would like to do
}
Моя попытка написать вспомогательную структуру, как указано выше FromStruct
, которую я могу создать с помощью array
, в котором у меня есть typedef FromStruct::type
, который предоставляет toBeUsed
с правильными аргументами , аналогично этому примеру , который делает то, что я хочу сделать здесь с типами, из которых состоит std :: tuple.
Ссылка на пример
здесь Я привожу упрощенный пример использования (2-й блок кода).