C++ 返回类型不同的方法的类型擦除
我想知道是否存在某种形式的类型擦除来处理具有相同名称和参数但返回不同值的方法,如下面的示例(C++ 返回类型不同的方法的类型擦除,c++,c++11,type-erasure,C++,C++11,Type Erasure,我想知道是否存在某种形式的类型擦除来处理具有相同名称和参数但返回不同值的方法,如下面的示例(begin和end)。我不打算在任何地方实际使用它,我只是想知道它是否可能,如果可能,如何实现 我所知道的类型擦除的唯一形式是有一个指向纯虚拟概念类的指针,该类指向一个模型,该模型将调用转发到底层的T。但是,这要求所有T都包含具有完全相同签名的方法,而在我的示例中,返回类型不同。据我所知,需要类似于虚拟模板函数的东西来完成我的要求,但我可能遗漏了一些东西 class Iterable { //ho
begin
和end
)。我不打算在任何地方实际使用它,我只是想知道它是否可能,如果可能,如何实现
我所知道的类型擦除的唯一形式是有一个指向纯虚拟概念
类的指针,该类指向一个模型
,该模型将调用转发到底层的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 << ' ';
}
}
class-Iterable
{
//这将如何定义?
}
int main(int argc,char*argv[])
{
向量v={1,2,3,4,5};
集合s={“foo”,“bar”,“baz”};
宜人宜人;
如果(argc==2)iterable=v;
else iterable=s;
用于(自动增值:it)
{
cout您可能对boost::any
感兴趣:
< P>类型擦除在C++中可以实现并已在不同的上下文中实现。最常用的方法是:在<代码> Boost中:任何< <代码> >代码> STD::函数>签名> <代码>,代码> STD::线程和其他基于非类型类,即类型为擦除对象,其中包含指向接口类型的指针。通常,在构造、分配或每当删除用户类型时,接口的实现都会被实例化和存储
作为一个简化的例子,我们想创建一个<代码>可打印的< /C> >类型,它可以用来打印任何类型的代码,实现了<代码>运算符> p> C++标准库不支持它的容器类型的运行时方差。实现这个没有错,但是没有垃圾的内存管理。在语言层面上的收集将会是非常美味的,你会从它的表现中得到乐趣
值得一提的是,在一些STL实现中,它们实现了一种称为可怕迭代的东西,vector::iterator
与vector::iterator
的类型相同
此外,您需要非常小心。向量绝对是可随机访问的,但集合只是可组合的,绝对不是可随机访问的,而InputIterator只是可转发的。您必须为所有这些场景定义模板。对于未来的位腐烂,仅链接的答案是脆弱的,可以吗也许用一些内容来扩展一下?
// 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();
}
};