- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一个花哨的“zip 迭代器”,它已经完成了许多角色(可以用于 for_each、复制循环、容器迭代器范围构造函数等......)。
在处理所涉及的对/元组的所有模板代码下,归结为迭代器的解引用运算符返回一个元组/一对引用,而不是对元组/对的引用。
我希望我的迭代器与 std::sort
一起工作,所以我需要能够做 swap(*iter1, *iter2)
并在迭代的原始容器中切换基础值。
代码和一个小demo可以看这里(有点看不懂):http://coliru.stacked-crooked.com/a/4fe23b4458d2e692
尽管 libstdc++ 的排序使用 std::iter_swap
其中调用 swap
,例如libc++ 没有,它只是调用 swap
直接,所以我想要一个涉及 swap
的解决方案作为定制点。
我已经尝试过(并且非常接近工作)而不是返回 std::pair
/std::tuple
来自 operator*
正如我现在所做的,返回的是一个简单的包装器类型。目的是让包装器表现得好像它是 std::pair
/std::tuple
,并允许我写一个 swap
为它发挥作用。
它看起来像这样:
template<typename... ValueTypes>
struct TupleWrapper : public PairOrTuple_t<ValueTypes...>
{
using PairOrTuple_t<ValueTypes...>::operator=;
template<typename... TupleValueTypes>
operator PairOrTuple_t<TupleValueTypes...>() const
{
return static_cast<PairOrTuple_t<ValueTypes...>>(*this);
}
};
template<std::size_t Index, typename... ValueTypes>
decltype(auto) get(TupleWrapper<ValueTypes...>& tupleWrapper)
{
return std::get<Index>(tupleWrapper);
}
template<std::size_t Index, typename... ValueTypes>
decltype(auto) get(TupleWrapper<ValueTypes...>&& tupleWrapper)
{
return std::get<Index>(std::forward<TupleWrapper<ValueTypes...>>(tupleWrapper));
}
template<typename... ValueTypes,
std::size_t... Indices>
void swap(TupleWrapper<ValueTypes...> left,
TupleWrapper<ValueTypes...> right,
const std::index_sequence<Indices...>&)
{
(std::swap(std::get<Indices>(left), std::get<Indices>(right)), ...);
}
template<typename... ValueTypes>
void swap(TupleWrapper<ValueTypes...> left,
TupleWrapper<ValueTypes...> right)
{
swap(left, right, std::make_index_sequence<sizeof...(ValueTypes)>());
}
namespace std
{
template<typename... ValueTypes>
class tuple_size<utility::implementation::TupleWrapper<ValueTypes...>> : public tuple_size<utility::implementation::PairOrTuple_t<ValueTypes...>> {};
template<std::size_t Index, typename... ValueTypes>
class tuple_element<Index, utility::implementation::TupleWrapper<ValueTypes...>> : public tuple_element<Index, utility::implementation::PairOrTuple_t<ValueTypes...>> {};
}
完整代码在这里:
http://coliru.stacked-crooked.com/a/951cd639d95af130 .
operator*
中返回此包装器似乎可以编译(至少在 GCC 上)但会产生垃圾。
std::tie
无法编译。
最佳答案
第一个问题
问题之一是ZipIterator
类不满足 RandomAccessIterator
的要求.
std::sort
需要 RandomAccessIterator
s 作为其参数 RandomAccessIterator
s 必须是 BidirectionalIterator
s BidirectionalIterator
s 必须是 ForwardIterator
s ForwardIterator
s 的条件是
::reference
必须是
value_type&
/
const value_type&
:
The type
std::iterator_traits<It>::reference
must be exactly
T&
ifIt
satisfiesOutputIterator
(It
is mutable)const T&
otherwise (It
is constant)(where
T
is the type denoted bystd::iterator_traits<It>::value_type
)
ZipIterator
目前没有实现。
std::for_each
和类似的函数,只需要迭代器满足
InputIterator
的要求/
OutputIterator
.
The
reference
type for an input iterator that is not also aLegacyForwardIterator
does not have to be a reference type: dereferencing an input iterator may return a proxy object orvalue_type
itself by value (as in the case ofstd::istreambuf_iterator
).
ZipIterator
可以用作
InputIterator
/
OutputIterator
,但不是
ForwardIterator
, 其中
std::sort
需要。
std::sort
允许将值移出容器,然后再将它们移回。
The type of dereferenced
RandomIt
must meet the requirements ofMoveAssignable
andMoveConstructible
.
ZipIterator
当前无法处理(它从不复制/移动引用的对象),所以这样的事情不能按预期工作:
std::vector<std::string> vector_of_strings{"one", "two", "three", "four"};
std::vector<int> vector_of_ints{1, 2, 3, 4};
auto first = zipBegin(vector_of_strings, vector_of_ints);
auto second = first + 1;
// swap two values via a temporary
auto temp = std::move(*first);
*first = std::move(*second);
*second = std::move(temp);
// Result:
/*
two, 2
two, 2
three, 3
four, 4
*/
(
test on Godbolt )
ForwardIterator
使用当前标准(例如
this question )
InputIterator
s/OutputIterator
s(或以不同方式处理您的 ZipIterator
)template<class It>
void bubble_sort(It begin, It end) {
using std::swap;
int n = std::distance(begin, end);
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (*(begin+j) > *(begin+j+1))
swap(*(begin+j), *(begin+j+1));
}
}
}
ZipIterator
类满足RandomAccessIterator
.关于c++ - 与 get、tie 和其他元组操作一起使用的元组包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63137322/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!