当T == void时如何最好地解决“ void foo(const T&t = T())”

悬挂式

我有一个函数,它具有类型为T的选项参数。

template<typename T>  
void foo( const T& t = T() )  
{ t.stuff; }

一切都很好,但是我现在有一个T变为的情况void在这种情况下,我希望没有操作为空的功能。我拥有的唯一可行的解​​决方案需要三个单独的声明,并且我有许多此类方法:

template<typename T> 
void foo( const T& t)
{ t.stuff; }

template<typename T>
inline void foo() 
{ foo(T()); }

template<> 
inline void foo<void>() {}

理想情况下,我希望应该有一个更优雅的解决方案来重载“ Void”功能,而无需诉诸第三个声明?尤其是最近有了新的C ++ 17解决了很多事情!更简短的语法会更好...

阿特耶

一个更简单的解决方案(因为只有两个重载)如下所示:

template<typename T>
void foo( const T& t = T() ) {
    t.stuff;
}

template<typename T>
std::enable_if_t<std::is_void_v<T>>
foo() {}

// void foo(const T&); is the only viable overload for non-void T,
// since std::enable_if_t SFINAEs

// void foo(); is the only viable overload for void T,
// since const T& forms a reference to void

由于您经常使用此模式,因此可以使用别名模板将其略微缩短:

template<typename T, typename TypeIfVoid = void>
using if_void = std::enable_if_t<std::is_void_v<T>, TypeIfVoid>;


template<typename T>
void foo(const T& t = T()) {
    t.stuff;
}

template<typename T>
if_void<T> foo() {}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

void_t如何工作

来自分类Dev

QFuture<void> won't work

来自分类Dev

template <class T,int N> void h(T const(&)[N]); 作为朋友功能

来自分类Dev

什么是void(* op)(T&)和void(* op)(T&,void *)?

来自分类Dev

错误:从 'void*' 到 'const uint8_t* {aka const unsigned char*}' [-fpermissive] 的无效转换

来自分类Dev

decltype(...,void())和void_t之间的区别

来自分类Dev

使用void_t的成员检测

来自分类Dev

比较void *与uint16_t

来自分类Dev

从std :: size_t转换为void

来自分类Dev

T *和const T *

来自分类Dev

如何将void *转换为size_t?

来自分类Dev

如何将void *转换为size_t?

来自分类Dev

foo(void)与foo(void *)

来自分类Dev

sizeof(size_t)== sizeof(void *)始终为真吗?

来自分类Dev

同义词函数调用::: new((void *)p)T(value);

来自分类Dev

在Windows上在SIZE_T和void *之间进行转换

来自分类Dev

为什么将char **(或任何T **)设为void **无效?

来自分类Dev

将std :: shared_ptr <T>强制转换为void *

来自分类Dev

有没有一种方法可以将void(*)(uint32_t,void(*)(uint32_t))转换为std :: function <void(uint32_t,std :: function <void(uint32_t)>)>?

来自分类Dev

对SFINAE使用void_t中带有参数的方法

来自分类Dev

C ++-从'void *'到'uint8_t **'的无效转换

来自分类Dev

C ++ SFINAE void_t无法正常工作

来自分类Dev

sizeof(void*) != sizeof(uintptr_t) 在实践中?

来自分类Dev

public <T extended Animal> void addAll(List <T>动物)和public void addAll(List <Animal>动物)有什么区别?

来自分类Dev

<Foo>与<T>相同

来自分类Dev

检查类T是否具有void_t成员类型Member

来自分类Dev

vm_offset_t,(void *)和mach_vm_size_t之间的差异

来自分类Dev

指针和多线程错误,预期为“ void *(*)(void *)”,但参数的类型为“ pthread_t”

来自分类Dev

如何比较T与T?

Related 相关文章

  1. 1

    void_t如何工作

  2. 2

    QFuture<void> won't work

  3. 3

    template <class T,int N> void h(T const(&)[N]); 作为朋友功能

  4. 4

    什么是void(* op)(T&)和void(* op)(T&,void *)?

  5. 5

    错误:从 'void*' 到 'const uint8_t* {aka const unsigned char*}' [-fpermissive] 的无效转换

  6. 6

    decltype(...,void())和void_t之间的区别

  7. 7

    使用void_t的成员检测

  8. 8

    比较void *与uint16_t

  9. 9

    从std :: size_t转换为void

  10. 10

    T *和const T *

  11. 11

    如何将void *转换为size_t?

  12. 12

    如何将void *转换为size_t?

  13. 13

    foo(void)与foo(void *)

  14. 14

    sizeof(size_t)== sizeof(void *)始终为真吗?

  15. 15

    同义词函数调用::: new((void *)p)T(value);

  16. 16

    在Windows上在SIZE_T和void *之间进行转换

  17. 17

    为什么将char **(或任何T **)设为void **无效?

  18. 18

    将std :: shared_ptr <T>强制转换为void *

  19. 19

    有没有一种方法可以将void(*)(uint32_t,void(*)(uint32_t))转换为std :: function <void(uint32_t,std :: function <void(uint32_t)>)>?

  20. 20

    对SFINAE使用void_t中带有参数的方法

  21. 21

    C ++-从'void *'到'uint8_t **'的无效转换

  22. 22

    C ++ SFINAE void_t无法正常工作

  23. 23

    sizeof(void*) != sizeof(uintptr_t) 在实践中?

  24. 24

    public <T extended Animal> void addAll(List <T>动物)和public void addAll(List <Animal>动物)有什么区别?

  25. 25

    <Foo>与<T>相同

  26. 26

    检查类T是否具有void_t成员类型Member

  27. 27

    vm_offset_t,(void *)和mach_vm_size_t之间的差异

  28. 28

    指针和多线程错误,预期为“ void *(*)(void *)”,但参数的类型为“ pthread_t”

  29. 29

    如何比较T与T?

热门标签

归档