Я реализовал NDArray (N-мерный массив), и у него есть метод setSizes с переменным числом аргументов. Использование аргументов шаблона с переменным числом аргументов безопаснее с точки зрения типов, чем использование аргументов с помощью функции переменного типа, кроме того, я могу контролировать количество параметров, переданных этой функции во время компиляции, только с помощью параметров шаблона с переменным числом аргументов.
void setSizes(uintmax_t currentSize) {
static_assert(1 == NDimensions, "Invalid count of arguments given to setSizes.");
size_ = currentSize;
data_ = new NDArrayReferenceType[currentSize];
}
template <typename... Sizes>
void setSizes(uintmax_t currentSize, Sizes... sizes) {
static_assert(sizeof...(Sizes) + 1 == NDimensions, "Invalid count of arguments given to setSizes.");
size_ = currentSize;
data_ = new NDArrayReferenceType[currentSize];
for (uintmax_t i = 0; i < currentSize; i++) {
data_[i]->setSizes(sizes...);
}
}
Я также реализовал универсальную оболочку конструктора для своего собственного SmartPointer. Он распространяется на весь пользовательский конструктор типа необработанного указателя.
template <typename TSmartPointer, typename... Args>
static inline void initialize(TSmartPointer *smartPointer, Args... args) {
smartPointer->pointer_ = new typename TSmartPointer::PointerType(std::forward<Args>(args)...);
smartPointer->__retain();
}
Этот код кажется неочевидным, он является частью инициализатора SmartPointer для случая, когда SmartPointer должен автоматически вызывать конструктор указателя при получении SmartPointer (RAII). В случае абстрактных классов он не может вызвать конструктор.
Итак, если у меня есть тип AbstractObject, который является SmartPointer абстрактного класса, и тип ConcreteObject, который является SmartPointer класса с конструктором, который принимает два целых числа, я могу написать следующий код:
AbstractObject object = ConcreteObject(42, 42);
Это похоже на C # и Java (но с RAII), и оно работает для меня в C ++ / GCC 4.8 =)