Шаблоны C ++ разнообразные, но статичные - PullRequest
3 голосов
/ 11 октября 2011

Я тренирую свои навыки шаблонов в C ++ и хочу реализовать векторный класс. Класс определяется векторным измерением N и типом T. Теперь я хотел бы иметь конструктор, который принимает ровно N переменных типа T. Однако я не могу понять, как сказать шаблону вариации, чтобы он принимал только N параметров. Может быть, это возможно со специализацией шаблона? Или я думаю не в том направлении? Будем весьма благодарны за любые мысли / идеи по этому поводу.

Больше мыслей

Во всех примерах шаблонов с переменными значениями, которые я уже видел, использовалась рекурсия для «перебора» списка параметров. Однако я имею в виду, что конструкторы нельзя вызывать из конструкторов (читайте комментарии в ответе). Так что, возможно, даже невозможно использовать шаблоны с переменным числом аргументов в конструкторах? Во всяком случае, это отодвинуло бы меня к использованию фабричной функции с той же основной проблемой.

1 Ответ

8 голосов
/ 11 октября 2011

Вариантный конструктор кажется подходящим:

template<typename T, int Size>
struct vector {
    template<typename... U>
    explicit
    vector(U&&... u)
        : data {{ std::forward<U>(u)... }}
    {
        static_assert( sizeof...(U) == Size, "Wrong number of arguments provided" );
    }

    T data[Size];
};

В этом примере используется идеальная переадресация и static_assert для генерации грубой ошибки, если в конструктор передаются не Size аргументы.Это может быть изменено:

  • Вы можете превратить жесткую ошибку в программную ошибку, используя std::enable_if (запуск SFINAE);Я бы не рекомендовал
  • вы можете изменить условие на sizeof...(U) <= Size, позволяя оставшимся элементам иметь инициализированное значение
  • вы можете требовать, чтобы типы, передаваемые в конструктор, были преобразованы вT или точно соответствует, например, T const&;либо превращение нарушения в грубую ошибку (снова используя static_assert), либо в мягкую ошибку (снова SFINAE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...