天道酬勤,学无止境

你如何声明一个 range-v3 视图返回值?(How do you declare a ranges-v3 view return value?)

问题

目前,我可以像这样编写 range-v3 视图:

auto v = ranges::view::reverse | ranges::view::filter([](int l){return l>5;});

但是如果我想从函数中返回 v,我需要知道它的类型。 range-v3 视图的类型是什么?

回答1

从 C++14 开始,您可以使用auto作为函数的返回类型,它将被推导出:

auto f() {
    return ranges::view::reverse | ranges::view::filter([](int l){return l>5;});
}
// f's return type is the type of the return expression, exactly as is I had:
// auto returnValue = return-expression;
// where f's type is decltype(returnValue)

唯一的缺点是f的定义必须出现在您使用它的同一个 TU 中。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何编写使用临时容器的范围管道?(How do I write a range pipeline that uses temporary containers?)
    问题 我有一个带有此签名的第三方函数: std::vector<T> f(T t); 我还有一个名为src的T的现有潜在无限范围(范围-v3 排序)。 我想创建一个管道,将f映射到该范围内的所有元素,并将所有向量展平为一个包含所有元素的范围。 本能地,我会写以下内容。 auto rng = src | view::transform(f) | view::join; 但是,这不起作用,因为我们无法创建临时容器的视图。 range-v3 如何支持这样的范围管道? 回答1 看起来 range-v3 库中现在有测试用例显示如何正确执行此操作。 有必要将views::cache1操作符添加到管道中: auto rng = views::iota(0,4) | views::transform([](int i) {return std::string(i, char('a'+i));}) | views::cache1 | views::join('-'); check_equal(rng, {'-','b','-','c','c','-','d','d','d'}); CPP_assert(input_range<decltype(rng)>); CPP_assert(!range<const decltype(rng)>); CPP_assert(!forward_range
  • 如何编写使用临时容器的范围管道?(How do I write a range pipeline that uses temporary containers?)
    问题 我有一个带有此签名的第三方函数: std::vector<T> f(T t); 我还有一个名为src的T的现有潜在无限范围(范围-v3 排序)。 我想创建一个管道,将f映射到该范围内的所有元素,并将所有向量展平为一个包含所有元素的范围。 本能地,我会写以下内容。 auto rng = src | view::transform(f) | view::join; 但是,这不起作用,因为我们无法创建临时容器的视图。 range-v3 如何支持这样的范围管道? 回答1 看起来 range-v3 库中现在有测试用例显示如何正确执行此操作。 有必要将views::cache1操作符添加到管道中: auto rng = views::iota(0,4) | views::transform([](int i) {return std::string(i, char('a'+i));}) | views::cache1 | views::join('-'); check_equal(rng, {'-','b','-','c','c','-','d','d','d'}); CPP_assert(input_range<decltype(rng)>); CPP_assert(!range<const decltype(rng)>); CPP_assert(!forward_range
  • How do you declare a ranges-v3 view return value?
    Currently, I can compose ranges-v3 views like this: auto v = ranges::view::reverse | ranges::view::filter([](int l){return l>5;}); But if I wanted to return v from a function I'd need to know its type. What is the type of a ranges-v3 view?
  • Range-v3:使用 view_facade 提供常量和非常量迭代器(Range-v3: Use view_facade to provide both const and non-const iterators)
    问题 我在使用 view_facade(来自 range-v3)来创建一个提供常量和非常量访问的视图时遇到了问题。 例如,我尝试修改 view_facade 测试(在 test/view_facade.cpp 中)以允许非常量访问(默认情况下它只允许常量访问): struct MyRange : ranges::range_facade<MyRange> { private: friend struct ranges::range_access; std::vector<int> ints_; template <bool isConst> struct cursor { private: using It = typename std::conditional<isConst, std::vector<int>::const_iterator, std::vector<int>::iterator>::type; using RefType = typename std::conditional<isConst, int const&, int&>::type; It iter; public: cursor() = default; cursor(It it) : iter(it) {} RefType current() const { return *iter; } //
  • 范围循环中的访问索引(Access index in range-for loop)
    问题 我有一个对象向量,并使用range-for循环对其进行迭代。 我正在使用它从对象中打印函数,如下所示: vector<thisObject> storedValues; //put stuff in storedValues for(auto i:storedValues) { cout<<i.function(); } 但是我也想打印索引。 我想要的输出是: 1: value 2: value //etc 我本来只是要使用每次增加的计数器,但这似乎效率很低。 有没有更好的办法? 回答1 你不能索引是向量的特定概念,而不是集合的通用属性。 另一方面,基于范围的循环是用于遍历任何集合的每个元素的通用机制。 如果确实要使用特定容器实现的详细信息,则只需使用普通循环即可: for (std::size_t i = 0, e = v.size(); i != e; ++i) { /* ... */ } 重复这一点:基于范围的循环用于处理任何集合的每个元素,集合本身无关紧要,并且在循环体内从未提及容器。 它只是工具箱中的另一个工具,因此您不必被迫将其用于所有内容。 相比之下,如果您要对集合进行突变(例如,删除或随机播放元素),或者要使用有关集合结构的特定信息,请使用普通循环。 回答2 我创建了一个预处理器宏(通过@Artyer进行了大大简化),该宏以相对干净的方式为您处理:
  • 显式 range-v3 decltype 评估为无效?(Explicit range-v3 decltype evaluates to void?)
    问题 我正在尝试获取范围的显式类型(将来我可能希望将其存储为类中的字段)。 但是,由于某种原因,它评估为void ? #include <iostream> #include <set> #include <range/v3/view/transform.hpp> class Alpha { public: int x; }; class Beta : public Alpha { }; class Foo { public: std::set<Alpha*> s; using RangeReturn = decltype(std::declval<std::set<Alpha*>>() | ranges::v3::view::transform(std::function<Beta*(Alpha*)>())); RangeReturn r(); }; Foo::RangeReturn Foo::r() { return s | ranges::v3::view::transform([](Alpha* a) { return static_cast<Beta*>(a); }); } int main() { } 当用 g++ -std=c++17 编译时,它给出 main.cpp:24:88: error: return-statement with a value, in
  • 如何创建过滤向量的迭代器?(How can I create iterators of a filtered vector?)
    问题 假设我有一个名为spot_deals的SpotDeal的向量,它是一个类: class SpotDeal { public: int deal_id_; // primary key, and vector is sorted by id string ccy_pair_; // ccy pair, e.g. GBPUSD, AUDUSD double amount_; } 假设我需要将两个spot_deals子集spot_deals给函数foo以进行某些计算。 但是,我可以制作副本,这会消耗内存和时间。 实际上foo只需要交易的迭代器。 那么我可以制作vector<SpotDeal> 2 个迭代器,即it1和it2并将它们传递给foo吗? spot_deals的两个子集可以通过ccy_pair_过滤,例如 GBPUSD 和 AUDUSD 的交易,或其他条件。 所以我正在寻找一种方法来定义由向量和 lambda 函数定义的迭代器(尽管可以等效地是一个函子)。 有没有办法编写一个辅助函数make_filtered_iterator以便我可以有如下内容? auto it1 = make_filtered_iterator(spot_deals, filter_lambda1); auto it2 = make_filtered_iterator(spot_deals
  • 我如何理解复杂的函数声明?(How do I understand complicated function declarations?)
    问题 我如何理解以下复杂的声明? char (*(*f())[])(); char (*(*X[3])())[5]; void (*f)(int,void (*)()); char far *far *ptr; typedef void (*pfun)(int,float); int **(*f)(int**,int**(*)(int **,int **)); 回答1 正如其他人指出的那样,cdecl是完成这项工作的正确工具。 如果您想在没有cdecl帮助的情况下理解这种声明,请尝试从内到外从右到左阅读 从列表char (*(*X[3])())[5];随机抽取一个示例char (*(*X[3])())[5]; 从X开始,X是要声明/定义的标识符(以及最里面的标识符): char (*(*X[3])())[5]; ^ X是 X[3] ^^^ 3的数组 (*X[3]) ^ /* the parenthesis group the sub-expression */ 指针 (*X[3])() ^^ 函数函数接受未指定(但固定)数量的参数 (*(*X[3])()) ^ /* more grouping parenthesis */ 并返回一个指针 (*(*X[3])())[5] ^^^ 5的数组的 char (*(*X[3])())[5]; ^^^^ ^ char组成。 回答2
  • MySQL 高级部分
    (1)索引(index)..................................................................... 1 (2)视图(view)....................................................................... 2 (3)触发器(trigger)............................................................. 6 (4)游标(cursor)...................................................................... 8 (5)事务(Transaction)............................................................. 10 (6)存储过程(Stored Procedure).......................................... 12 索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 优点: 大大加快数据的检索速度; 创建唯一性索引,保证数据库表中每一行数据的唯一性
  • 你如何在 MVC 的 PHP 页面之间传递值?(How do you pass values between PHP pages for MVC?)
    问题 PHP 程序如何在模型、视图和控制器页面之间传递值? 例如,如果控制器有一个数组,它如何将它传递给视图? 编辑: 谢谢你的回答。 我看到其中一些声明组件在同一页面中,但是当我查看类似 CodeIgniter 的内容时,我看到三个单独的 PHP 页面分别用于模型、视图和控制器。 回答1 通常您的控制器会创建一个视图对象,当它创建该视图对象时,它会传递信息。 <?php class Controller { public function __construct() { $arr = array("a","b","c"); $myView = new View($arr); } } class View { private $content; public function __construct($content) { $this->content = $content; include_once('myPage.inc.html'); } } ?> 回答2 CodeIgniter 与大多数 PHP MVC 框架一样,带有一个视图“引擎”。 换句话说,框架中有一个类负责从控制器加载和传输数据到视图。 特定于 CodeIgniter,这些调用如下所示: $data = array( 'title' => 'My Title', 'heading' => 'My Heading'
  • 使用XML声明自定义android UI元素(Declaring a custom android UI element using XML)
    问题 如何使用XML声明Android UI元素? 回答1 《 Android开发人员指南》有一个名为“构建自定义组件”的部分。 不幸的是,对XML属性的讨论仅涉及在布局文件中声明控件,而实际上并未处理类初始化中的值。 步骤如下: 1.在values\attrs.xml声明属性 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyCustomView"> <attr name="android:text"/> <attr name="android:textColor"/> <attr name="extraInformation" format="string" /> </declare-styleable> </resources> 请注意,在declare-styleable标记中使用了非限定名称。 非标准android属性(例如extraInformation需要声明其类型。 在超类中声明的标签将在子类中可用,而无需重新声明。 2.创建构造函数 由于有两个使用AttributeSet进行初始化的构造函数,因此方便地创建一个单独的初始化方法以供构造函数调用。 private void init(AttributeSet attrs) { TypedArray a
  • 如何在 Sql Server (2005) 的 VIEW 中“声明标量变量”(How do I “Declare the scalar variable” in a VIEW in Sql Server (2005))
    问题 我正在尝试在SQL Server 2005 中创建一个视图。 SQL 代码是这样工作的(我在 VS2008 中使用它),但在 SQL Server 中我无法保存它,因为错误消息“声明标量变量@StartDate”和“声明标量变量@EndDate”弹出向上。 这是代码: WITH Calendar AS (SELECT CAST(@StartDate AS datetime) AS Date UNION ALL SELECT DATEADD(d, 1, Date) AS Expr1 FROM Calendar AS Calendar_1 WHERE (DATEADD(d, 1, Date) < @EndDate)) SELECT C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers] FROM Calendar AS C CROSS JOIN dbo.Country AS C2 LEFT OUTER JOIN dbo.Requests AS R ON C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID GROUP BY C.Date
  • 如何声明存储通过引用返回的对象的变量?(How to declare a variable that stores an object returned by reference?)
    问题 C++ 引用仍然让我感到困惑。 假设我有一个函数/方法,它创建一个Foo类型的对象并通过引用返回它。 (我假设如果我想返回对象,它不能是分配在堆栈上的局部变量,所以我必须用new在堆上分配它): Foo& makeFoo() { ... Foo* f = new Foo; ... return *f; } 当我想将创建的对象存储在另一个函数的局部变量中时,类型应该是Foo void useFoo() { Foo f = makeFoo(); f.doSomething(); } 或Foo& ? void useFoo() { Foo& f = makeFoo(); f.doSomething(); } 由于两者都是正确的语法:这两种变体之间是否存在显着差异? 回答1 你的第一个代码做了很多工作: void useFoo() { Foo f = makeFoo(); // line 2 f.doSomething(); } 想想第 2 行,一些有趣的事情发生了。 首先,编译器将发出代码以使用类的默认构造函数在f处构造一个Foo对象。 然后,它将调用makeFoo() ,它还会创建一个新的Foo对象并返回对该对象的引用。 编译器还必须发出代码,将makeFoo()的临时返回值复制到f处的对象中,然后它会销毁临时对象。 第 2 行完成后,将调用f.doSomething() 。
  • 如何设置一个简单的委托以在两个视图控制器之间进行通信?(How do I set up a simple delegate to communicate between two view controllers?)
    问题 我有两个UITableViewControllers ,需要使用委托将值从子视图控制器传递给父视图控制器。 我知道代表是什么,只想看一个简单易懂的示例。 谢谢你 回答1 简单的例子... 假设子视图控制器具有UISlider ,我们希望通过委托将滑块的值传递回父级。 在子视图控制器的头文件中,声明委托类型及其方法: ChildViewController.h #import <UIKit/UIKit.h> // 1. Forward declaration of ChildViewControllerDelegate - this just declares // that a ChildViewControllerDelegate type exists so that we can use it // later. @protocol ChildViewControllerDelegate; // 2. Declaration of the view controller class, as usual @interface ChildViewController : UIViewController // Delegate properties should always be weak references // See http://stackoverflow
  • SQL Server输出参数问题(SQL Server output parameter issue)
    问题 我正在使用SQL Server 2008 Enterprise。 我正在学习SQL Server存储过程的OUTPUT参数。 例如,存储过程sp_add_jobschedule具有一个称为schedule_id的OUTPUT参数。 http://msdn.microsoft.com/en-us/library/ms366342.aspx 我的困惑是,好像可以为OUTPUT参数提供一个输入值并返回一个值,好像它具有INPUT和OUTPUT参数的行为吗? 是否允许不为OUTPUT参数提供任何INPUT值(使其看起来像纯输出参数行为)? 回答1 这种混乱在一定程度上是合理的-像Oracle这样的其他RDBMS确实具有存储过程参数,这些参数可以是IN类型(仅输入), OUT类型(仅输出)或INOUT (两种方式-“通过引用传递”类型的参数) 。 SQL Server在这里有点草率,因为它将参数标记为OUTPUT ,但是实际上,这意味着INPUT / OUTPUT -它基本上只是意味着存储的proc有机会从该参数的调用中返回值。 所以是的-尽管它被称为OUTPUT参数,但实际上更多的是INPUT / OUTPUT参数,而像Oracle中的那些IN , INOUT , OUT在SQL Server中不存在(在T-SQL中)。 回答2 我可以举一个简短的示例
  • 过滤STL容器的现代方法?(Modern way to filter STL container?)
    问题 经过多年的C#工作后回到C ++,我想知道现代的方式-阅读:C ++ 11-过滤数组的方式,即如何实现类似于此Linq查询的内容: var filteredElements = elements.Where(elm => elm.filterProperty == true); 为了过滤元素向量(出于这个问题,使用strings )? 我衷心希望现在可以取代需要定义显式方法的旧STL样式算法(甚至是boost::filter_iterator类的扩展名)吗? 回答1 请参阅cplusplus.com中的示例以获取std :: copy_if: std::vector<int> foo = {25,15,5,-5,-15}; std::vector<int> bar; // copy only positive numbers: std::copy_if (foo.begin(), foo.end(), std::back_inserter(bar), [](int i){return i>=0;} ); std::copy_if在此处为foo每个元素评估lambda表达式,如果返回true ,则将值复制到bar 。 std::back_inserter允许我们使用迭代器在bar的末尾实际插入新元素(使用push_back() ),而不必先将其大小调整为所需的大小。 回答2
  • 什么是 NullReferenceException,我该如何解决?(What is a NullReferenceException, and how do I fix it?)
    问题 这个问题的答案是社区的努力。 编辑现有答案以改进这篇文章。 它目前不接受新的答案或互动。 我有一些代码,当它执行时,它抛出一个NullReferenceException ,说: 你调用的对象是空的。 这是什么意思,我该怎么做才能解决这个错误? 回答1 原因是什么? 底线 您正在尝试使用null (或 VB.NET 中的Nothing )。 这意味着您要么将其设置为null ,要么根本不将其设置为任何内容。 像其他任何事情一样, null会被传递。 如果它在方法“A”中为null ,则可能是方法“B”向方法“A”传递了一个null 。 null可以有不同的含义: 未初始化的对象变量,因此不指向任何内容。 在这种情况下,如果您访问此类对象的成员,则会导致NullReferenceException 。 开发人员有意使用null来表示没有有意义的可用值。 请注意,C# 具有变量的可为空数据类型的概念(例如数据库表可以具有可为空字段)-您可以为它们分配null以指示其中没有存储值,例如int? a = null; int? a = null; (这是Nullable<int> a = null;的快捷方式),其中问号表示允许将null存储在变量a 。 您可以使用if (a.HasValue) {...}或if (a==null) {...} 。 可空变量,像a本例中
  • 如何访问 UINavigationController 中以前的视图元素(how to access previous view elements in UINavigationController)
    问题 我有一个 UINavigationController,我在其中加载不同的视图控制器。 我想知道如何访问之前视图的元素(如标签等)。 这是一个例如。 View A myLabel.text = @"first view"; (用户移动到视图 B) 视图 B(用户输入了一条消息,我需要在视图 A 中显示)类似于 ViewA.myLabel.text = @"用户输入的消息" 我尝试了很多东西,但找不到任何非常有用的东西。 请帮忙.. 我正在使用没有 ARC 和故事板的 Xcode 4。 谢谢山姆 编辑: 我想更新在 View A 的 viewController 中声明的属性,而不是直接更新标签。 我的标签使用该属性进行更新。 就像在推送 viewController 时,我们可以传递如下值。 ViewA *myView = [[ViewA alloc] init]; myView.title = @"View B" ; myView.tableView.tag = 3; myView.myTextView.text = @"Some Text"; [self.navigationController pushViewController:myView animated:YES]; [myView release]; 有没有办法在弹出 ViewB 并返回到 ViewA
  • range-v3 如何操作::加入分隔符(range-v3 how to action::join with delimiter)
    问题 我从 git 获得了 MSVC 的 range-v3。 并由 MSVC C++14 编译器编译。 考虑代码: auto getter2 = [](const std::string&r) { return r+r; }; std::vector<std::string> vv = { "11","22", "33" }; std::cout << (vv | view::transform(getter2) | action::join) << std::endl; 它按预期工作。 但我想添加分隔符加入,如果我写 std::cout << (vv | view::transform(getter2) | action::join(",")) << std::endl; 代码没有被编译。 怎么了? 大量编译器错误如下: 1>d:\sources\ranges_test\ranges_test.cpp(28): error C2672: 'operator __surrogate_func': no matching overloaded function found 1>d:\sources\ranges_test\ranges_test.cpp(28): error C2783: 'unknown-type ranges::v3::action::action<ranges
  • 什么是 NullReferenceException,我该如何解决?(What is a NullReferenceException, and how do I fix it?)
    问题 这个问题的答案是社区的努力。 编辑现有答案以改进这篇文章。 它目前不接受新的答案或互动。 我有一些代码,当它执行时,它抛出一个NullReferenceException ,说: 你调用的对象是空的。 这是什么意思,我该怎么做才能解决这个错误? 回答1 原因是什么? 底线 您正在尝试使用null (或 VB.NET 中的Nothing )。 这意味着您要么将其设置为null ,要么根本不将其设置为任何内容。 像其他任何事情一样, null会被传递。 如果它在方法“A”中为null ,则可能是方法“B”向方法“A”传递了一个null 。 null可以有不同的含义: 未初始化的对象变量,因此不指向任何内容。 在这种情况下,如果您访问此类对象的成员,则会导致NullReferenceException 。 开发人员有意使用null来表示没有有意义的可用值。 请注意,C# 具有变量的可为空数据类型的概念(例如数据库表可以具有可为空字段)-您可以为它们分配null以指示其中没有存储值,例如int? a = null; int? a = null; (这是Nullable<int> a = null;的快捷方式),其中问号表示允许将null存储在变量a 。 您可以使用if (a.HasValue) {...}或if (a==null) {...} 。 可空变量,像a本例中