使用给定参数调用构造函数的可变参数函数
Variadic Function That Calls Constructor With Given Arguments
需要创建具有不同参数类型的可变参数 template<T>
函数,这些函数将使用给定参数调用 T
的构造函数,有点像创建线程时相反(当创建线程时,它的构造函数在给定的函数指针处调用函数)。
所以在伪代码中它应该看起来像这样
template<typename T>
T* CreateNew( ARGS ) {
return new T( ARGS ); //Constructor Gets Same Arguments That Were
} //Passed To The Function
希望它的行为像创建线程时那样,当它们使用 不同类型 的参数调用函数时(我不确定如何实现)。
我不太清楚,但我想你想查找可变参数模板,例如:
template <typename T, typename... Args>
T* CreateNew(Args... args) {
return new T(args...);
}
添加示例:
#include <iostream>
class A {
public:
A(int a){
std::cout<<__PRETTY_FUNCTION__<<std::endl;
}
A(std::string a){
std::cout<<__PRETTY_FUNCTION__<<std::endl;
}
A(int a,std::string b){
std::cout<<__PRETTY_FUNCTION__<<std::endl;
}
};
template<typename T, typename... Args>
T* create(Args... args){
return new T(args...);
}
int main(){
A b(1);
A c("a");
A d(1,"a");
A* bp = create<A>(1);
A* cp = create<A>("a");
A* dp = create<A>(1,"a");
// This code leaks
return 0;
}
请注意,因为改动尽可能少,所以我们这里仍然return一个T*
作为原始代码。大多数时候,这不是一个好主意,因为所有权是通过原始指针传递的。因此,正如评论所建议的,您可能想要使用 std::unique_ptr
,这将使您的 CreateNew
函数基本上等同于 std::make_unique
.
这个函数的正确写法是
template <typename T, typename... Args>
T* CreateNew(Args&&... args) {
return new T(std::forward<Args>(args)...);
}
没有转发引用 Args&&
并且没有 std::forward
,传递参数的原始值类别将不会传播到 T
的构造函数,从而导致潜在的性能和语义问题.
需要创建具有不同参数类型的可变参数 template<T>
函数,这些函数将使用给定参数调用 T
的构造函数,有点像创建线程时相反(当创建线程时,它的构造函数在给定的函数指针处调用函数)。
所以在伪代码中它应该看起来像这样
template<typename T>
T* CreateNew( ARGS ) {
return new T( ARGS ); //Constructor Gets Same Arguments That Were
} //Passed To The Function
希望它的行为像创建线程时那样,当它们使用 不同类型 的参数调用函数时(我不确定如何实现)。
我不太清楚,但我想你想查找可变参数模板,例如:
template <typename T, typename... Args>
T* CreateNew(Args... args) {
return new T(args...);
}
添加示例:
#include <iostream>
class A {
public:
A(int a){
std::cout<<__PRETTY_FUNCTION__<<std::endl;
}
A(std::string a){
std::cout<<__PRETTY_FUNCTION__<<std::endl;
}
A(int a,std::string b){
std::cout<<__PRETTY_FUNCTION__<<std::endl;
}
};
template<typename T, typename... Args>
T* create(Args... args){
return new T(args...);
}
int main(){
A b(1);
A c("a");
A d(1,"a");
A* bp = create<A>(1);
A* cp = create<A>("a");
A* dp = create<A>(1,"a");
// This code leaks
return 0;
}
请注意,因为改动尽可能少,所以我们这里仍然return一个T*
作为原始代码。大多数时候,这不是一个好主意,因为所有权是通过原始指针传递的。因此,正如评论所建议的,您可能想要使用 std::unique_ptr
,这将使您的 CreateNew
函数基本上等同于 std::make_unique
.
这个函数的正确写法是
template <typename T, typename... Args>
T* CreateNew(Args&&... args) {
return new T(std::forward<Args>(args)...);
}
没有转发引用 Args&&
并且没有 std::forward
,传递参数的原始值类别将不会传播到 T
的构造函数,从而导致潜在的性能和语义问题.