当前位置:  开发笔记 > 编程语言 > 正文

处理解除引用语法的C++泛型类

如何解决《处理解除引用语法的C++泛型类》经验,为你挑选了1个好方法。



1> Barry..:

处理某些类型需要使用成员/方法访问的事实的最佳方法是什么.操作员,而其他人使用 - >操作员.

只是不要.

你的工作就是写作template class container.那个容器装有Ts.如果您的用户想要对其执行某些操作,则T应该展示执行某些操作的能力 - 但是他们有责任正确执行该操作.否则,你只是增加了大量的代码膨胀.太棒了,你给了我一个打印所有元素的方法,但如果我知道要调用foo()它们,或者找到第一个bar()返回大于42的元素的元素怎么办?很显然,你不会写for_each_foo()find_if_bar_is_42().

这就是标准库将容器与算法分开的原因.让你的容器,可用作可能的方式是把它公开两个iterator通过S begin()end(),然后我可以做任何我需要做的用户:

container values;
values.add(...);

// I know to use '.'
for (T& t : values) {
   t.print();
} 

container pointers;
pointers.add(...);

// I know to use '->'
for (T* t : pointers) {
    t->print();
}

auto iter = std::find_if(pointers.begin(), pointers.end(), [](T* t){
    return t->bar() == 42;
});

除此之外,您可以添加一些自己使用callables的成员函数,因此您将工作传递给用户:

template 
void for_each(F&& f) {
    for (auto& elem : elements_) {
        f(elem);              // option a
        std::invoke(f, elem); // option b, as of C++17
    }
}

所以上面的例子是:

values.for_each([](T& t){ t.print(); });
pointers.for_each([](T* t){ t->print(); });
values.for_each(std::mem_fn(&T::print));
pointers.for_each(std::mem_fn(&T::print));

请注意,始终由用户知道该怎么做.另外,如果你std::invoke()在执行中使用for_each,那么你可以写:

pointers.for_each(&T::print);
values.for_each(&T::print);

并且,就此而言:

container> unique_ptrs;
unique_ptrs.for_each(&T::print);

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有