定义一个函数,当任何子类传入时,返回对应 runtime 的 vector<actual_class>
.
如
some_type function(const Base& obj) {
// doing something
return vector<Base>();
}
当实参为 Base
的子类 Derive
时,如何推导返回 vector<Derive>
?
尝试了 decltype(obj)
,对应类型是 Derive&
,而在 vector 中是无法使用 reference 的。
而如果使用
std::remove_reference<decltype(obj)>::type
甚至
std::remove_const<std::remove_reference<decltype(obj)>::type>::type
,得到的都是 Base 类型。
如果把引用改成用指针,或者智能指针,应该是可破的。但是如果要坚持使用引用,求问有没有什么方法?
1
ryd994 2017-03-01 00:07:15 +08:00 via Android
这恐怕不能靠推导
用 template 吧 |
2
snnn 2017-03-01 08:29:37 +08:00
不可能。做不到。
你把这个函数改成模板函数就行了。 |
3
htfy96 2017-03-01 08:50:31 +08:00 via Android
template<typename DeriveT, typename = enable_if_t<is_base_of_v<BaseT, DeriveT>>>
foo bar(const DeriveT&) 大概是这样? |
4
pagict OP 上面 3 位
@ryd994 @snnn @htfy96 都推荐用模板,我思考了一下,应该有两种实现。 template<typename T> vector<T> function(const T&) throws{ if (!is_base_of<Base, T>::value) throw exception; // do something return vector<T>(); } 第二种 template <typename T, typename = enable_if<is_base_of<Base, T>::value>::type> vector<T> function(const T&) { // do something return vector<T>(); } 似乎第二种更好? |
8
noli 2017-03-17 18:33:17 +08:00
典型的多分派行为,不想用模版的话可以考虑 Visitor 模式。
|