Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回类型不同的方法的类型擦除_C++_C++11_Type Erasure - Fatal编程技术网

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();
   }
};