我有一些代碼需要函數指針,但我需要用 做的「new T(x,y,z)」來調用它。作爲函數的新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次,每個參數數量一次,我想避免在頭文件中添加這麼多的樣板文件。
我有一些代碼需要函數指針,但我需要用 做的「new T(x,y,z)」來調用它。作爲函數的新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次,每個參數數量一次,我想避免在頭文件中添加這麼多的樣板文件。
在C++ 11可以使用可變參數模板:
template<typename T, typename... Args>
T* Construct(Args&&... args)
{
return new T(std::forward<Args>(args)...);
}
此外,考慮是否真的想返回原始指針,而不是一個智能指針(例如,一個unique_ptr
除非你。做低層次的東西,使用擁有原始指針不鼓勵在現代C++
我相信這是個什麼標準分配的作用:。
#include <memory>
std::allocator<T> alloc;
T * p = alloc.allocate(1);
alloc.construct(p, x, y, z);
謝謝。看到我對Andy的解決方案的評論。這有效,除了我需要一個這樣做的函數,它必須是一個可變模板。我只能使用STL中已經存在的一個函數或方法。這聽起來好像沒有一個。 – user2557021
,當然,'返回的std :: make_ <獨特/莎爾ed>(std :: forward(args)...);' –
chris
謝謝,那種作品,但不像我預想的那樣。如果這個確切的功能已經存在於STL中,我仍然很好奇。你的解決方案對我來說不適用的原因是我沒有(但)被允許在我的代碼庫中使用可變參數模板。如果這個函數已經在STL中,我可以使用它。 – user2557021
@ user2557021:那麼你可能要考慮Kerrek的解決方案 –