Ada*_*dam 4 c++ type-erasure c++11
我想知道是否存在某种形式的类型擦除来处理具有相同名称和参数但返回不同值的方法,如下面的示例(begin和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 << ' ';
}
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*eas 10
类型擦除可以并且已经在不同的上下文中用C++实现.最常用的方法是在boost::any和std::function< signature >,std::thread和其他方法中使用,它基于非多态类,它是类型擦除对象,它包含指向接口类型的指针.在内部,在构造,分配期间或者在擦除用户类型时,实例化并存储接口的实现.
作为一种激励的简化的例子,假设我们要创建一个printable可用于打印实现任何类型的类型operator<<来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();
}
};
Run Code Online (Sandbox Code Playgroud)
请注意,该模式与常规多态层次结构非常相似,不同之处在于添加了一个接口对象,它是一种值类型(从C#借用术语值类型),它保存了实际的多态对象.
以这种方式看待它,它似乎有点简单和无用,但这是驱动的燃料boost::any(内部接口只是一个typeid),std::function< void () >(内部接口是它实现的void operator()),或shared_ptr<>(接口是删除方法,放弃资源).
有一种特定的不同类型的类型擦除当需要使用实现类型擦除的类型来破坏它时:使用临时并将其绑定到常量引用...但这是非常具体的,如果你想要的,你可以在这里阅读:http://drdobbs.com/cpp/184403758
在你在问题中讨论的具体情况中,它有点复杂,因为你不想删除单个类型,而是删除其中的几个类型.该Iterable接口必须清除其内部保存的容器的类型,并在这样做它必须提供它自己的迭代器必须从容器中的迭代器进行类型擦除.尽管如此,这个想法基本上是一样的,只是需要做更多的工作才能实现.