Как передать аргументы шаблона size_t в стиле подписи функции?

#c #templates

#c #шаблоны

Вопрос:

Я хочу определить класс A , который ожидает тип T и произвольное количество size_t N_i... в качестве аргументов шаблона:

 template< typename T, size_t... N_i>
class A
{
  // ...
};
 

Согласно A приведенному выше определению, я должен передать аргументы шаблона A в форме A<float,1,2,3> a (для примера T=float и N_i...=1,2,3 ), однако
для лучшего чтения я бы предпочел синтаксис (в стиле подписи функции), т. Е. A<float, (1,2,3)> a Где значения size_t передаются в круглых скобках. Кто-нибудь знает, как это можно реализовать?

Заранее большое спасибо.

Комментарии:

1. Нет, у вас не может быть такого точного синтаксиса с шаблонами C . Вы должны пойти на компромисс.

2. Вы все равно можете выполнить макрос #define NS(...) __VA_ARGS__ , а затем A<float, NS(1,2,3)> a;

Ответ №1:

В C не может быть точно такого синтаксиса (список в скобках будет выражением, содержащим операторы запятой, будет равен последнему значению).

Редактировать Следующий первый проект не будет работать: грубо говоря, параметр, не относящийся к типу, должен быть целочисленным / перечисляемым типом, ссылкой или каким-то указателем. Смотрите Этот список для фактического исчерпывающего списка.

Если вы готовы вместо этого принять фигурные скобки:

 template< typename T, std::initializer_list<size_t> N_i>
class A
{
  // ...
};

A<float, {1,2,3}> a;
 

Редактировать
Вы можете заставить его работать, изменив его на:

 template< typename T, const std::initializer_list<size_t> *N_i>
class A
{
  // ...
};

const std::initializer_list<size_t> a_arg{1,2,3}
A<float, amp;a_arg> a;    
 

Но это ужасно нарушает «читаемость».

Существуют и другие сложные решения, включающие магический тип, который имеет подходящий оператор запятой, но а) сделать это приемлемым в качестве аргумента шаблона сложно; б) удобочитаемость будет хуже, чем то, с чего вы начали.

Комментарии:

1. Нет, это недопустимый тип параметра, не относящийся к типу шаблона.

2. @T.C.: Исправлено (иш)