c – 概念的“declval”之类的东西
当您使用模板和使用decltype时,即使您没有任何时刻,也经常需要某种类型的实例.在这种情况下,std :: declval< T>()非常有用.这会创建一个类型为T的虚构实例.
概念有类似的东西吗?即为概念创建和虚构类型的函数. 让我举个例子(有点做作,但应该达到目的): 让我们定义一个概念Incrementable template <typename T> concept Incrementable = requires(T t){ { ++t } -> T; }; 现在我想有一个概念来测试一个对象是否具有可以接受Incrementable的operator operator().在我想象的语法中,我会写这样的东西: template <typename F,typename T = declval<Incrementable>> concept OperatesOnIncrementable = requires(F f,T t){ { f(t) } -> T; } 在typename中的declval T = declval< Incrementable>会创建一个虚构的类型T,它不是一个真正的具体类型,但是对于所有意图和目的来说,它的行为类似于满足Incrementable的类型. 在即将出台的标准中是否有机制允许这样做?我觉得这非常有用. 编辑:前段时间我问过similar question是否可以用boost :: hana完成. 编辑:为什么这有用?例如,如果要编写一个组成两个函数的函数 template <typename F,typename G> auto compose(F f,G g) { return [f,g](Incrementable auto x) { return f(g(x)); }; } 当我尝试编写两个无法编写的函数时,我想得到一个错误.在不限制类型F和G的情况下,只有在我尝试调用组合函数时才会出错. 解决方法
这个术语是一个原型.提出原型将是一个非常有价值的功能,对于执行定义检查等操作至关重要.来自T.C.的回答:
这样做的方法是合成一个尽可能最低限度满足概念标准的原型.正如他所说,在C 20中没有原型生成,并且鉴于目前的概念化,这似乎是不可能的. 提出正确的原型是非常困难的.例如,对于 template <typename T> concept Incrementable = requires(T t){ { ++t } -> T; }; 写作很有诱惑力: struct Incrementable_archetype { Incrementable_archetype operator++(); }; 但这并不是“尽可能小” – 这种类型是默认的可构造和可复制的(不是Incrementable强加的要求),并且它的运算符正好返回T,这也不是要求.所以一个真正的铁杆原型看起来像: struct X { X() = delete; X(X const&) = delete; X& operator=(X const&) = delete; template <typename T> operator,(T&&) = delete; struct Y { operator X() &&; }; Y operator++(); }; 如果你的函数适用于X,那么它可能适用于所有Incrementable类型.如果您的函数不适用于X,那么您可能需要更改实现,以便更改或更改约束以允许更多功能. 有关更多信息,请查看Boost Concept Check Library,它已经很老了,但至少阅读文档非常有趣. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |