加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 概念的“declval”之类的东西

发布时间:2020-12-16 10:15:01 所属栏目:百科 来源:网络整理
导读:当您使用模板和使用decltype时,即使您没有任何时刻,也经常需要某种类型的实例.在这种情况下,std :: declval T()非常有用.这会创建一个类型为T的虚构实例. 概念有类似的东西吗?即为概念创建和虚构类型的函数. 让我举个例子(有点做作,但应该达到目的): 让我
当您使用模板和使用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的情况下,只有在我尝试调用组合函数时才会出错.

解决方法

Is there a something similar for concepts? i.e. a function which would create and imaginary type for a concept.

这个术语是一个原型.提出原型将是一个非常有价值的功能,对于执行定义检查等操作至关重要.来自T.C.的回答:

Thus,even if you could magically synthesize some unique type,you still have no guarantee that F operates on all Incrementable types.

这样做的方法是合成一个尽可能最低限度满足概念标准的原型.正如他所说,在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,它已经很老了,但至少阅读文档非常有趣.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读