如何在参数和返回类型上使用匹配的const修饰符编写函数?

克林德·金

我想编写一个从结构中提取指针字段的函数。要求是,如果我将struct作为const参数传递,则返回的类型应为const。如果不是,则返回的类型不应为const。

例如,

struct S {
    char *p;
};

// approach 1: two overload functions with duplicate body
auto extract(S &input) -> int * {
    return reinterpret_cast<int *>(input.p + 12);
}
auto extract(const S &input) -> const int * {
    return reinterpret_cast<const int *>(input.p + 12);
}

// approach 2: macro
#define macro_extract(input) (reinterpret_cast<int *>(input.p + 12))

模板或最新的C ++标准中是否有任何技巧可以编写强类型函数而无需复制主体?

编辑:稍微更改了示例以更准确地反映实际问题。

慈济

这是带有单个功能模板的解决方案:

template<typename T, 
         typename = std::enable_if_t<
                      std::is_same_v<
                        std::remove_cv_t<
                          std::remove_reference_t<T>>, S>>>
auto extract(T&& input) 
  -> std::conditional_t<
       std::is_const_v<
         std::remove_reference_t<T>>, int const *, int *> 
{
    return input.p;
}

这是一个演示

我认为不用多说,过载组会更好。如果函数体很大,您仍然可以从const重载中调用非const版本,然后在其中添加const。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用参数中的不匹配引用修饰符动态播送可变参数模板?

来自分类Dev

成员函数的const修饰符如何影响重载解析?

来自分类Dev

使用引用参数的构造函数的显式修饰符

来自分类Dev

如何使用修饰符修改* args的类型?

来自分类Dev

如何在TypeScript中使用修饰符正确包装构造函数

来自分类Dev

如何在步进器中使用增量和减量功能,同时还使用onChange修饰符

来自分类Dev

如何在Windows 10上使用修饰符重新映射键

来自分类Dev

SwiftUI textFieldStyle修饰符RoundedBorderTextFieldStyle和PlainTextFieldStyle之间的类型不匹配

来自分类Dev

如何删除类型名称中每个元素的const ref修饰符... T

来自分类Dev

c#如何在RegExp中编写点修饰符?

来自分类Dev

如何使用修饰符控制继承?

来自分类Dev

为什么非成员函数不允许使用类似const的修饰符

来自分类Dev

参数的非法修饰符

来自分类Dev

在渲染的伪图案内使用样式修饰符和图案参数

来自分类Dev

C ++ 11继承构造函数和访问修饰符

来自分类Dev

是否可以在同一T上使用通用的“ in”和“ out”修饰符?

来自分类Dev

使用Python的重试修饰符的动态参数

来自分类Dev

使用函数修饰符从集合中删除值

来自分类Dev

使用Smarty修饰符

来自分类Dev

如何在python中使用内联正则表达式修饰符

来自分类Dev

为什么以及如何在C#中使用静态只读修饰符

来自分类Dev

如何在PHP中使用dotall修饰符指定行尾?

来自分类Dev

如何在Vim贴图/过滤器中使用扩展修饰符?

来自分类Dev

如何在PHP中使用dotall修饰符指定行尾?

来自分类Dev

Decimal.MinValue和Decimal.MaxValue:为什么使用静态只读而不使用const修饰符?

来自分类Dev

.Net 程序集和内部访问修饰符的使用

来自分类Dev

参数和返回类型上的重载函数

来自分类Dev

C#重载的构造函数仅在使用参数修饰符时不能有所不同

来自分类Dev

如何使用 Bootstrap 的 bg-variant 修饰符

Related 相关文章

  1. 1

    如何使用参数中的不匹配引用修饰符动态播送可变参数模板?

  2. 2

    成员函数的const修饰符如何影响重载解析?

  3. 3

    使用引用参数的构造函数的显式修饰符

  4. 4

    如何使用修饰符修改* args的类型?

  5. 5

    如何在TypeScript中使用修饰符正确包装构造函数

  6. 6

    如何在步进器中使用增量和减量功能,同时还使用onChange修饰符

  7. 7

    如何在Windows 10上使用修饰符重新映射键

  8. 8

    SwiftUI textFieldStyle修饰符RoundedBorderTextFieldStyle和PlainTextFieldStyle之间的类型不匹配

  9. 9

    如何删除类型名称中每个元素的const ref修饰符... T

  10. 10

    c#如何在RegExp中编写点修饰符?

  11. 11

    如何使用修饰符控制继承?

  12. 12

    为什么非成员函数不允许使用类似const的修饰符

  13. 13

    参数的非法修饰符

  14. 14

    在渲染的伪图案内使用样式修饰符和图案参数

  15. 15

    C ++ 11继承构造函数和访问修饰符

  16. 16

    是否可以在同一T上使用通用的“ in”和“ out”修饰符?

  17. 17

    使用Python的重试修饰符的动态参数

  18. 18

    使用函数修饰符从集合中删除值

  19. 19

    使用Smarty修饰符

  20. 20

    如何在python中使用内联正则表达式修饰符

  21. 21

    为什么以及如何在C#中使用静态只读修饰符

  22. 22

    如何在PHP中使用dotall修饰符指定行尾?

  23. 23

    如何在Vim贴图/过滤器中使用扩展修饰符?

  24. 24

    如何在PHP中使用dotall修饰符指定行尾?

  25. 25

    Decimal.MinValue和Decimal.MaxValue:为什么使用静态只读而不使用const修饰符?

  26. 26

    .Net 程序集和内部访问修饰符的使用

  27. 27

    参数和返回类型上的重载函数

  28. 28

    C#重载的构造函数仅在使用参数修饰符时不能有所不同

  29. 29

    如何使用 Bootstrap 的 bg-variant 修饰符

热门标签

归档