我想知道是否存在某种形式的类型擦除来处理具有相同名称和参数但返回不同值的方法,如下面的示例所示(begin
and end
)。我并不打算在任何地方实际使用它,我只是想知道它是否可能,如果可能的话,将如何完成。
我所知道的类型擦除的唯一形式是拥有指向纯虚拟的指针concept
类指向一个model<T>
它将调用转发给底层T
。然而,这需要所有T
包含具有完全相同签名的方法,而在我的示例中,返回类型不同。据我所知,需要类似于虚拟模板函数的东西来完成我所要求的操作,但我可能会遗漏一些东西。
class Iterable
{
//how would this be defined?
}
int main(int argc, char *argv[])
{
vector<int> v = {1, 2, 3, 4, 5};
set<string> s = {"foo", "bar", "baz"};
Iterable iterable;
if(argc == 2) iterable = v;
else iterable = s;
for(auto val : it)
{
cout << val << ' ';
}
}
类型擦除可以并且已经在不同上下文中在 C++ 中实现。最常见的方法,用于boost::any
, std::function< signature >
, std::thread
和其他基于非多态类,即类型已删除对象,其中包含指向接口类型的指针。在内部,在构造、分配期间或每当擦除用户类型时,都会实例化并存储接口的实现。
作为一个激励性的简化示例,考虑我们想要创建一个printable
类型可用于打印实现的任何类型operator<<
to std::cout
使用类型擦除。为此我们需要类型printable
、内部接口printable_impl_base
,以及实际的实现:
// regular polymorphic hierarchy:
struct printable_impl_base {
virtual ~printable_impl_base() {}
virtual void print() const = 0;
};
template <typename T>
struct printable_impl : printable_impl_base {
T copy_to_print;
printable_impl( T const & o ) : copy_to_print( o ) {}
virtual void print() const {
std::cout << copy_to_print << std::endl;
}
};
// type erasure is performed in printable:
class printable {
std::shared_ptr<printablable_impl_base> p;
public:
template <typename T>
printable( T obj ) : p( new printable_impl<T>(obj) ) {}
void print() const {
p->print();
}
};
请注意,该模式与常规多态层次结构非常相似,不同之处在于界面添加的对象是值类型(借用术语值类型来自 C#),其中包含实际的多态对象。
这样看来,似乎有点简单化和无用,但这就是驱动的燃料boost::any
(内部接口只是一个typeid),std::function< void () >
(内部接口是它实现void operator()
), or shared_ptr<>
(该接口是删除器方法,放弃资源)。
当实现类型擦除的类型需要做的唯一一件事就是销毁它时,有一种特定的不同类型的类型擦除:使用临时并将其绑定到常量引用...但这非常具体,如果你想要的可以在这里阅读:http://drdobbs.com/cpp/184403758
在您在问题中讨论的具体情况下,它有点复杂,因为您不想删除单个类型,而是删除其中的几个类型。这Iterable
接口必须擦除它内部保存的容器的类型,并且在这样做时,它必须提供自己的迭代器,这些迭代器必须对容器中的迭代器执行类型擦除。不过,想法基本上是一样的,只是需要做更多的工作来实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)