问题标签 [c++-concepts]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - void_t“可以实现概念”?
我正在观看Walter Brown 关于模板元编程的 CppCon2014 演讲的第二部分,在此期间他讨论了他的新颖void_t<>
构造的用途。在他的演讲中,Peter Sommerlad 问了他一个我不太明白的问题。(链接直接指向问题,讨论中的代码直接发生在此之前)
萨默拉德问
沃尔特,这是否意味着我们现在实际上可以实施概念精简版?
沃尔特对此做出了回应
哦耶!我已经做到了......它没有完全相同的语法。
我理解这次交流是关于 Concepts Lite 的。这种模式真的那么通用吗?无论出于何种原因,我都没有看到它。有人可以解释(或草图)这样的东西看起来如何吗?这只是关于enable_if
和定义特征,还是提问者指的是什么?
void_t
模板定义如下:
然后他使用它来检测类型语句是否格式正确,并使用它来实现is_copy_assignable
类型特征:
因为谈话,我理解了这个例子是如何工作的,但我不明白我们是如何从这里得到像 Concepts Lite 这样的东西的。
c++ - 是否可以使用 Boost 概念检查库验证方法返回类型?
我已经开始使用Boost 概念检查库。但是,在阅读文档之后,我似乎没有找到一种方法来验证概念中的方法是否返回某种类型。但是,我也没有看到任何说这是不可能的,这很奇怪。
那么,如果返回类型不正确,是否可以编写一个会失败的概念?
c++ - 是否有任何 STL 实现支持 C++ 概念?
我正在研究一个使用 C++ 概念的类项目。我在哪里可以找到支持来自概念草案 TS的约束的 STL 实现,例如Equality_comparable
or Sortable
?
谢谢你的帮助!
这是我到目前为止所尝试的:
我已经成功地c++-concepts
从 GCC 的 SVN 编译了分支,该分支似乎得到了维护(昨天由 Andrew Sutton 更新)。但是,此分支附带的 libstdc++ 尚未更新概念。
我还尝试了 Concepts-Lite (gcc-clite),它承诺:
该编译器附带的标准库包含论文“A Concept Design for the STL”中的约束,可以通过包含
<type_traits>
头文件来访问该约束。
但是,从该页面下载的 GCC 代码中的 libstdc++ 也没有概念。特别是,type_traits
标头似乎与它所派生的 GCC 修订版相比没有变化。
c++ - C++: Polymorphic container / iterator vs compile time concept / traits
Background
This is purely for educational purposes. If you don't want to read the whole background, you can skip to the question at the bottom.
I have written a Queue interface (abstract class), and 2 derived implementations based on resizing arrays and linked lists.
I wanted to be able to go over a queue's elements with an STL compliant iterator (I know queues should not be iterable), so I can use for (auto e: c)
or queue.begin()
/ queue.end()
.
Because I use run-time polymorphism I had to add a client iterator class to IQueue
and use the Pimpl idiom to instantiate the actual implementation specific iterators in the derived queue classes, to avoid object slicing issue.
So the augmented code looks like:
and one of the derived classes implements the begin()
/ end()
methods and the derived Iterator implementation:
Now in order to test that the iterators work I have the following 2 functions:
Question
How can I get rid of the run-time polymorphism (remove IQueue, remove the iterator Pimpl implementations), and rewrite the testQueue()
/ testQueueImpl()
functions so that:
- the functions can successfully test the Stack implementations and Stack iterators, without having a base class pointer.
- that both LinkedListQueue and ResizingArrayQueue adhere to some kind of a compile-time interface (the enqueue, dequeue, isEmpty, size methods are present, the begin / end methods are present, both classes contain valid iterator classes)?
Possible solution
For 1) it seems that I can simply change the template argument to be the whole container, and the program compiles successfully and runs. But this does not check for the existence of the begin() / end() / enqueue() methods.
For 2) from what I could find on the internet, it seems that the relevant solution would involve Type Traits / SFINAE / or Concepts (Container concept, forward iterator concept). It seems that Boost Concepts library allows annotating a class to conform to a container concept, but I am interested in a self-contained solution (no external libraries except STL) for educational purposes.
c++ - 如何使用 C++ 概念(“concepts lite”)支持构建 gcc?
C++ 标准委员会正在制定概念扩展的 TS(技术规范):“编程语言 - 概念的 C++ 扩展”。N4377是本文档的最新版本。为了包含在 C++ 标准功能中,要求实现,理想情况下是可公开访问的系统。
我知道concept-gcc但上面的概念提案(通俗地称为Concepts Lite)是不同的。我听说有一个概念分支,我尝试了origin/asutton/c++-concepts
from gcc的git
镜像,但没有编译。如何构建和使用上述 [draft] TS 中指定的 gcc 支持概念版本?
c++ - “简化概念的使用”中的 C++ 概念示例
我正在阅读 Bjarne Stroustrup 的迷你论文“简化概念的使用”,我遇到了以下片段(第 9 页),我在下面复制了该片段:
显然,每个类型都是 an
ABx
也是Ax
,所以:换句话说,一般来说,我们必须防止
ACx
's [原文如此]与'sa()
不同。如果这两个s 可以不同,我们不能接受上面的调用,因为它会调用“错误”。</p>Ax
a()
a()
g(t)
a()
我很难理解这个例子;特别是,我不明白最后的讨论。
- Bjarne 的意思是
ABx
而不是ACx
?(我标记的地方[原文如此]) - Bjarne 的意思是说那是
X
一种有效的类型吗?如果 only是有效的,那么我认为不应该适用,所以没有歧义。a(x)
b(x)
a(x)
template<ABx T> void f(T t);
- 当 Bjarne 声称这两种
a()
实现可能不同时,我不知道他是什么意思。它们不必相同吗?
我确信 Bjarne 的示例是正确的,但我对 C++ 概念的了解还不够。如果有人可以启发我,我会很高兴。
c++ - 用 C++ 编写和检查你自己的概念
我正在编写一个仅使用头文件的 C++ 库,该库大量使用模板。现在我想添加一些概念检查来处理在模板参数中使用不正确类型时引发的编译时错误。
例如,我需要可以指向单个对象(如 std::shared_ptr)的类指针对象的概念,可以指向一个数组(通过 operator[])但不能与指针一起使用的类指针对象算术(如 std::unique_ptr),以及可以与指针算术等一起使用的指针。
由于概念仍然不是标准的并且编译器不支持,我需要自己实现它。我知道 Boost Concept 库,但出于某种原因,我不想将它添加到依赖项中。
那么问题来了,如何实现对某些类型需求的检查呢?它是如何在 Boost 中实现的?在这种情况下,哪些技术是常见的?
c++ - 概念检查函数不适用于可移动参数
我有一个调用回调函数的函数,该函数接受只能移动的类型(例如unique_ptr
)。
尝试编译此代码时,我收到一条消息,该BOOST_CONCEPT_ASSERT
行尝试复制unique_ptr
. 如果我删除该行,则代码可以正常工作。似乎 Boost.Concept 库不支持移动语义。在不编写我自己的概念类的情况下是否有任何解决方法(顺便说一句,支持左值和右值作为它们的参数并不是很简单)。
c++ - 与 .net 相比,C++ 的所有权概念
以下是我从目前关于该主题的知识中得出的一系列结论,问题本质上是这是否正确,如果不正确,对这些结论的适当修正是什么。
作为一名经验丰富的 .net 开发人员,我完全认同所有对象实例几乎都以粒子的形式存在于云中,并且对象成员关系只是将这些粒子相互关联。当粒子或粒子云无法通过某些引用链接回框架中的根对象时,它或其成员将被丢弃。这本质上是引用计数和某种网络分析的结果,以保持对对象是否仍有通往根的路径的理解。
在这种结构中,对象的可识别实例可以被许多其他对象引用(“拥有”),并且所有权网络可以根据需要变得复杂和循环/自引用。
在过渡到 C++ 时,为了内存管理的利益,这种自由必须受到限制。所有对象都必须具有清晰的所有权树,对象的生命周期由其父对象维护。
生命周期也可能受到范围的限制,如花括号代码部分 {} 中的临时值。Lifetime 也可以,但绝对可以避免,通过使用new
关键字和小心使用delete
在较新的 C++ 标准化中,shared_ptr 之类的东西似乎被设计为允许更接近 .net 托管内存模型的东西。我不知道这些是否也提供与丢弃自引用但未连接的对象云的托管内存相同的好处。
一个例子是 std::list。据我所知,推荐的策略是列表中的对象实例必须在没有 shared_ptr 构造的好处的情况下完全由列表拥有,并且其生命周期由列表自身的生命周期决定。这导致需要复制构造函数、临时调用的析构函数,或者使用要求列表具有单一具体类型的 emplace 方法。替代解决方案包括在别处存储指向对象的指针和管理对象的生命周期,尽管这充满了明显的危险。这一切似乎都很尴尬。
在 .net 中,列表可以引用一个对象,而不必是它的父母或监护人,因为对象的生命周期是由其他方式管理的。
我知道堆内存和堆栈内存之间的区别会对性能产生影响,但是我对这个主题并不了解。
我对这两个系统的看法基本上正确吗?如果不是,可以提供哪些更正?如果它本质上是正确的,那么存在哪些描述我需要采用的 C++ 心智模型来创建大型、强大和高性能应用程序的文献?这包括代码的最佳实践以及稳健地管理大型应用程序的更抽象概念。