说我有以下功能:
template<typename T>
shared_ptr<T> my_func(...){
....
....
return make_shared<T>(...);
}
这个功能:
template<typename T>
T my_func(...){
....
....
return T(...);
}
理想情况下,我想做的事情是:
vector<shared_ptr<T>> ptr_vec = { my_func<T>(...), my_func<T>(...), ... };
vector<T> non_ptr_vec = {my_func<T>(...),...};
不必“看到”多于一个函数名my_func
。
现在,我正在处理我写作的内容:
template<typename T>
shared_ptr<T> my_func_shared_ptr(...){...}
template<typename T>
T my_func(...){...}
但这会增加复杂性。
如何使用模板来完成此功能?
答案 0 :(得分:0)
因此,感谢评论中的输入,找出了另一种解决方法。
如果我向模板引入“虚拟”类,则重载返回类型就足够了。
template<typename T, typename U>
shared_ptr<T> my_func(...){...}
template<typename T>
T my_func(...){...}
然后,
struct ptr{};
A a = my_func<A>(...);
shared_ptr<A> a_ptr = my_func<A,ptr>(...);
这成为函数的标签......编译和工作。我也可以在输入中使用它,而不是模板:
struct return_ptr{};
struct return_obj{};
template<typename T>
shared_ptr<T> my_func(...,return_ptr return_type){...};
template<typename T>
T my_func(...,return_obj return_type){...};
这样,在致电:
vector<shared_ptr<A>> a_ptrs = {my_func<A>(...,return_ptr()),...};
vector<A> a_objs = {my_func<A>(...,return_obj()),...};