C ++:如何使用模板重载返回类型?

时间:2017-07-14 16:01:44

标签: c++ templates overloading

说我有以下功能:

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(...){...}

但这会增加复杂性。

如何使用模板来完成此功能?

1 个答案:

答案 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()),...};