gpt4 book ai didi

c++ - 具有不同返回类型的方法的类型删除

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:48 25 4
gpt4 key购买 nike

我想知道是否存在某种形式的类型删除来处理具有相同名称和参数但返回不同值的方法,如下面的示例(beginend)。我不打算在任何地方实际使用它,我只是想知道它是否可行,如果可行,将如何完成。

我所知道的类型删除的唯一形式是有一个指向纯虚拟 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和其他基于非多态类,即类型删除对象,它包含指向接口(interface)类型的指针。在内部,在构造、分配期间或每当删除用户类型时,都会实例化并存储接口(interface)的实现。

作为一个激励性的简化示例,假设我们想要创建一个 printable可用于打印实现 operator<< 的任何类型的类型至 std::cout使用类型删除。为此,我们需要类型 printable , 内部接口(interface) 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();
}
};

请注意,该模式与常规多态层次结构非常相似,不同之处在于添加了一个接口(interface)对象,它是一个值类型(借用术语值类型来自 C#),其中包含实际的多态对象。

这样看,似乎有点简单和无用,但这是驱动的燃料 boost::any (内部接口(interface)只有一个typeid),std::function< void () > (内部接口(interface)是它实现了 void operator() ),或者 shared_ptr<> (接口(interface)是删除方法,放弃资源)。

当唯一需要对实现类型删除的类型做的事情就是销毁它时,有一种特定的不同类型的类型删除:使用临时对象并将其绑定(bind)到常量引用......但这是非常具体的,如果你愿意,你可以在这里阅读:http://drdobbs.com/cpp/184403758

在您在问题中谈论的特定情况下,它有点复杂,因为您不想删除单个类型,而是想删除其中的几个。 Iterable接口(interface)必须删除它内部持有的容器的类型,并且在这样做时它必须提供它自己的迭代器,这些迭代器必须对容器中的迭代器执行类型删除。尽管如此,想法基本相同,只是需要做更多的工作才能实现。

关于c++ - 具有不同返回类型的方法的类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6089498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com