如何将C ++概念与type_traits配合使用?

乔多克

我想抽象类型接口,并且很难在概念和type_traits的两种C ++方法之间做出选择。请考虑以下情形:

template <typename T>
int foo(const T& t) { return t.size() + t.size(); }

T请提供该类型int T::size() const为了创建更好的错误消息,增加用户定义类型的客户端的可用性,并为客户提供明确定义的可接受类型必须具备的功能列表,可以引入以下概念:

template <typename T>
concept SizeHaving = requires(T t) {
    t.size();
}

template <SizeHaving T>
int foo(const T& t) { return t.size() + t.size(); }

但是,如果一个客户类型原则上可以满足这个概念,但从技术上来说却不能(并且不能更改,因为它可能是第三方库的一部分)怎么办?一个type_trait可以帮助您:

struct Special {
   int Dimension() const; // logically identical to size(), but a different name
};

template <typename T>
struct Type_traits {
    static int size(const T& t) { return t.size(); }
};

template <> // user can provide the specialization for the custom type
struct Type_traits<Special> {
    static int size(const Special& c) { return c.Dimension(); }
};

template <typename T>
int foo(const T& t) {
    return Type_traits<T>::size(t) + Type_traits<T>::size(t);
}

如果的标准实现Type_trait不适合自定义类型(并且未提供专业化设置),则会再次出现非常不幸的错误消息。如何将概念融入其中?我试过的是

template <typename T>
concept SizeHaving = requires(T t) {
    Type_traits<T>::size(t);
}

但是无论哪种形式,无论是否Type_traits<T>::size()可以显式实例化表达式约束都将在技术上得到满足,从而使该概念毫无用处。我能做什么?

贾罗德42

您可能还会限制自己的特征:

template <typename T>
concept SizeHaving = requires(const T& t) {
    t.size(t);
};

template <typename T>
struct Type_traits
{
    auto size(const T& t) requires(SizeHaving<T>) { return t.size(); }
};

template <typename T>
concept TraitSizeHaving = requires(T t) {
    Type_traits<T>::size(t);
};

template <TraitSizeHaving T>
int foo(const T& t) {
    return Type_traits<T>::size(t) + Type_traits<T>::size(t);
}

然后专门针对您的自定义类型:

struct Special {
   int Dimension() const; // logically identical to size(), but a different name
};

template <> // user can provide the specialization for the custom type
struct Type_traits<Special> {
    static int size(const Special& c) { return c.Dimension(); }
};

演示

注意:requires(SizeHaving<T>)应该在成员上进行,而不是在类上进行,以允许对该类进行专门化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用C ++ 11 type_traits了解Microsoft的_Is_duration

来自分类Dev

如何使用type_traits仅在特定类型上添加模板类的成员函数。C ++

来自分类Dev

如何在 type_traits 中使用 C++11 std::is_member_object_pointer?

来自分类Dev

如何使用type_traits或模板功能专门化来巩固模板方法

来自分类Dev

如何不使用type_traits检查复制构造函数是否为noexcept?

来自分类Dev

如何使用type_traits或模板功能专门化来巩固模板方法

来自分类Dev

编译器如何定义 type_traits 中的类?

来自分类Dev

如何使用type_traits生成代码,具体取决于是否存在类专门化?

来自分类Dev

如何在不使用type_traits的情况下检查复制构造函数是否为noexcept?

来自分类Dev

如何将配对与光子配合使用?

来自分类Dev

如何将KeyListener与音频配合使用?

来自分类Dev

如何在C ++ 17中使用type_traits检测具有特定名称和签名的函数(NOT类成员)的存在

来自分类Dev

使用type_traits检查constness

来自分类Dev

如何正确地从函数中给出向量(type_traits)

来自分类Dev

如何将array.indexOf与协议配合使用?

来自分类Dev

如何将Pyqt与有思想的檐篷配合使用

来自分类Dev

如何将Play WS与SSL配合使用?

来自分类Dev

如何将离子存储与电容器配合使用?

来自分类Dev

如何将Pyqt与有思想的檐篷配合使用

来自分类Dev

如何将Uuid与Postgresql Gist索引类型配合使用?

来自分类Dev

如何将jQuery的.hover()与div堆栈配合使用

来自分类Dev

如何将Mobx与React Rails配合使用?

来自分类Dev

如何将Express Router与React配合使用

来自分类Dev

如何将PAM与MySQL配合使用(在Xenial上)?

来自分类Dev

如何将公寓的宝石与ActionCable配合使用?

来自分类Dev

C ++有没有一种方法可以基于type_traits进行模板重载?

来自分类Dev

std type_traits 与 Qt type_traits 冲突

来自分类Dev

为什么要使用结构实现type_traits

来自分类Dev

标准容器的type_traits?

Related 相关文章

  1. 1

    使用C ++ 11 type_traits了解Microsoft的_Is_duration

  2. 2

    如何使用type_traits仅在特定类型上添加模板类的成员函数。C ++

  3. 3

    如何在 type_traits 中使用 C++11 std::is_member_object_pointer?

  4. 4

    如何使用type_traits或模板功能专门化来巩固模板方法

  5. 5

    如何不使用type_traits检查复制构造函数是否为noexcept?

  6. 6

    如何使用type_traits或模板功能专门化来巩固模板方法

  7. 7

    编译器如何定义 type_traits 中的类?

  8. 8

    如何使用type_traits生成代码,具体取决于是否存在类专门化?

  9. 9

    如何在不使用type_traits的情况下检查复制构造函数是否为noexcept?

  10. 10

    如何将配对与光子配合使用?

  11. 11

    如何将KeyListener与音频配合使用?

  12. 12

    如何在C ++ 17中使用type_traits检测具有特定名称和签名的函数(NOT类成员)的存在

  13. 13

    使用type_traits检查constness

  14. 14

    如何正确地从函数中给出向量(type_traits)

  15. 15

    如何将array.indexOf与协议配合使用?

  16. 16

    如何将Pyqt与有思想的檐篷配合使用

  17. 17

    如何将Play WS与SSL配合使用?

  18. 18

    如何将离子存储与电容器配合使用?

  19. 19

    如何将Pyqt与有思想的檐篷配合使用

  20. 20

    如何将Uuid与Postgresql Gist索引类型配合使用?

  21. 21

    如何将jQuery的.hover()与div堆栈配合使用

  22. 22

    如何将Mobx与React Rails配合使用?

  23. 23

    如何将Express Router与React配合使用

  24. 24

    如何将PAM与MySQL配合使用(在Xenial上)?

  25. 25

    如何将公寓的宝石与ActionCable配合使用?

  26. 26

    C ++有没有一种方法可以基于type_traits进行模板重载?

  27. 27

    std type_traits 与 Qt type_traits 冲突

  28. 28

    为什么要使用结构实现type_traits

  29. 29

    标准容器的type_traits?

热门标签

归档