2013-07-06 3 views
1

У меня есть код, который хочет указатель на функцию, но мне нужно называть его чем-то, что делает «новый T (x, y, z)».new T (x, y, z) как функция

я могу написать функцию вдоль линий:

template<T, X, Y, Z> 
T* Construct(X x, Y y, Z z) { 
    return new T(x, y, z); 
} 

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

ответ

3

В C++ 11 вы можете использовать шаблоны VARIADIC:

template<typename T, typename... Args> 
T* Construct(Args&&... args) 
{ 
    return new T(std::forward<Args>(args)...); 
} 

Кроме того, подумайте, действительно ли вы хотите вернуть сырой указатель, а не смарт-указатель (например, в unique_ptr Если вы не. делая материал низкого уровня, используя владеющие сырые указатели не рекомендуется в современном C++

+0

И, конечно же, 'вернуть станд :: make_ <уникальный/Shar ed> (std: forward (args) ...); ' – chris

+0

Спасибо, такие работы, но не так, как я ожидал. Мне все еще интересно, существует ли эта функция в STL. Причина, по которой ваше решение не совсем подходит для меня, заключается в том, что мне пока не разрешено использовать вариационные шаблоны в моей кодовой базе. Если бы эта функция уже была в STL, я мог бы ее использовать. – user2557021

+0

@ user2557021: Тогда вы можете рассмотреть решение Kerrek –

3

Я считаю, что это то, что делает стандарт распределитель:.

#include <memory> 

std::allocator<T> alloc; 

T * p = alloc.allocate(1); 
alloc.construct(p, x, y, z); 
+0

Спасибо. Смотрите мои комментарии для решения Энди. Это работает, за исключением того, что мне нужно иметь функцию, которая делает это, и она обязательно должна быть вариационным шаблоном. Я могу использовать только тот, который уже существует как функция или метод в STL. Похоже, нет никого. – user2557021

Смежные вопросы