序幕:
std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();
Run Code Online (Sandbox Code Playgroud)
C++ 1z将引入结构化绑定的语法,这样可以编写代替
int a, b, c;
std::tie(a, b, c) = f();
Run Code Online (Sandbox Code Playgroud)
就像是
auto [a, b, c] = f();
Run Code Online (Sandbox Code Playgroud)
但是,std::tie也允许指定std::ignore忽略某些组件,例如:
std::tie(a, b, std::ignore, c) = g();
Run Code Online (Sandbox Code Playgroud)
是否可以使用新的结构化绑定语法执行类似的操作?它会如何工作?
玩弄了这个,我怀疑它不可能,但我想我会问专家.我有以下C++代码:
class IInterface
{
virtual void SomeMethod() = 0;
};
class Object
{
IInterface* GetInterface() { ... }
};
class Container
{
private:
struct Item
{
Object* pObject;
[... other members ...]
};
std::list<Item> m_items;
};
我想将这些方法添加到Container:
MagicIterator<IInterface*> Begin();
MagicIterator<IInterface*> End();
为了让呼叫者可以写:
Container c = [...]
for (MagicIterator<IInterface*> i = c.Begin(); i != c.End(); i++)
{
IInterface* pItf = *i;
[...]
}
所以基本上我想提供一个类似乎迭代某些集合(其中Begin()和End()的调用者不允许看到)的IInterface指针,但它实际上迭代了指向其他指针的指针集合.对象(Container类专用),可以转换为IInterface指针.
几个关键点:
MagicIterator是在外面定义的Container.
Container::Item 必须保持私密.
MagicIterator有遍历IInterface,指针尽管事实Container持有std::list<Container::Item>.Container::Item包含一个 …我知道这些问题之前有各种各样的问题,但这有点不同.
我有一个包含std :: map的类.虽然我希望在类中使用映射用于其他目的,但在外部我想要将迭代器适配器暴露给映射内的值(即std :: pair中的第二项).
例如在python中我可能会这样做:
def __iter__(self):
return self._dict.itervalues()
Run Code Online (Sandbox Code Playgroud)
我如何在c ++中执行此操作,将实现隐藏在类中?
谢谢,
担
我有一类兴趣(称之为X).
我有一个std :: list <X*>(称之为L).
我有一个功能(称之为F).
F(L)根据检查列表中每个X的内部状态的算法返回L的子集(std :: list <X*>).
我在我的应用程序中添加了一个std :: map <int,X*>(称之为M),我需要定义F(M)以与F(L)相同的方式运行 - 也就是说, F(M)也必须返回一个std :: list <X*>,通过检查地图中每个X的内部状态来确定.
作为一个自我描述的懒惰程序员,我立即看到该算法将[逻辑]相同,并且每个数据类型(std :: list和std :: map)都是可迭代的模板.我不想两次保持相同的算法,但我不确定如何继续前进.
一种方法是从F(M)中取出X*(即键值映射中的'值'),将它们放入std :: list <X*>中,并将处理过去到F(std :: list <X*>),传递返回std :: list <X*>; 回过头来.我看不出这是唯一的方法.
我的问题:如何在一个地方维护核心算法,但保留迭代序列或对关联容器的值的能力?
谢谢!
我在C++ 03环境中工作,并将一个函数应用于地图的每个键是很多代码:
const std::map<X,Y>::const_iterator end = m_map.end();
for (std::map<X,Y>::const_iterator element = m_map.begin(); element != end; ++element)
{
func( element->first );
}
Run Code Online (Sandbox Code Playgroud)
如果key_iterator存在,相同的代码可以利用std::for_each:
std::for_each( m_map.key_begin(), m_map.key_end(), &func );
Run Code Online (Sandbox Code Playgroud)
那为什么不提供呢?有没有办法让第一种模式适应第二种模式?