#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.: Исправлено (иш)