在C ++ 11中,我如何专门化基于返回类型接受函数对象的函数模板?

约翰·道蒂

我在C ++ 11中有一个包装函数,旨在与lambda一起使用,如下所示:

template<typename Func>
int WrapExceptions(Func&& f)
{
  try
  {
    return f();
  }
  catch(std::exception)
  {
    return -1;
  }
}

我可以这样称呼它:

int rc = WrapExceptions([&]{
  DoSomething();
  return 0;
});
assert(rc == 0);

生活还可以。不过,我想做的是重载或专用化包装函数,以便当内部函数返回void时,外部函数返回默认值0,例如:

int rc = WrapExceptions([&]{
  DoSomething();
});
assert(rc == 0);

我实际上可以在C ++ 11中执行此操作吗?我一辈子都想不起来。

贾罗德42

您可以使用SFINAE:

  • std::result_of

    template<typename Func>
    typename std::enable_if<
        std::is_convertible<typename std::result_of<Func()>::type, int>::value,
        int
        >::type
    WrapExceptions(Func&& f)
    {
      try { return f(); }
      catch(std::exception) { return -1; }
    }
    
    template<typename Func>
    typename std::enable_if<
        std::is_same<void, typename std::result_of<Func()>::type>::value,
        int
        >::type
    WrapExceptions(Func&& f)
    {
      try { f(); return 0; /* default value */ }
      catch(std::exception) { return -1; }
    }
    
  • decltype

    template<typename Func>
    auto
    WrapExceptions(Func&& f)
    -> typename std::enable_if<
        std::is_convertible<decltype(f()), int>::value,
        int
        >::type
    {
      try { return f(); }
      catch(std::exception) { return -1; }
    }
    
    template<typename Func>
    auto
    WrapExceptions(Func&& f)
    -> typename std::enable_if<
        std::is_same<void, decltype(f())>::value,
        int
        >::type
    {
      try { f(); return 0; }
      catch(std::exception) { return -1; }
    }
    

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何专门化C ++中的可变参数模板函数?

来自分类Dev

如何基于类型相关的类型专门化C ++模板类函数?

来自分类Dev

如何使C ++模板化函数与返回类型无关,以便将来进行专门化

来自分类Dev

C++ - 在具有非类型模板参数的模板化类上专门化函数模板

来自分类Dev

c ++未能专门化函数模板'iterator_traits'

来自分类Dev

C ++-部分专门化模板类成员函数

来自分类Dev

C ++-专门化类模板的成员函数

来自分类Dev

C ++ 11函数模板专门存在于类方法中(如果存在)

来自分类Dev

为什么C ++函数模板实例化的返回类型包含在错误的函数名称中?

来自分类Dev

C ++在可变参数模板内部专门化可变参数模板

来自分类Dev

C ++ 98中基于函数对象operator()签名的“过载”函数模板

来自分类Dev

C ++ 98中基于函数对象operator()签名的“过载”函数模板

来自分类Dev

为什么C ++函数模板在其签名中包含返回类型

来自分类Dev

C ++:数组的功能模板专门化

来自分类Dev

如何专门化模板成员函数?

来自分类Dev

为一组类型专门化函数模板

来自分类Dev

C++ 函数模板:必须使用 & 作为参数类型和返回类型吗?

来自分类Dev

C ++接受函数作为模板以及函数返回类型的返回向量

来自分类Dev

为什么不能在C ++模板中部分地专门化成员函数

来自分类Dev

为什么不能在C ++模板中部分地专门化成员函数

来自分类Dev

我该如何对使用模板化args的函数进行模板化,并在c ++中对其应用模板化函数?

来自分类Dev

从成员类型推断类型的C ++函数模板?

来自分类Dev

在Swift中,返回相同类型的函数的泛型函数使我“无法显式专门化泛型函数”

来自分类Dev

C ++ 11:如何编写两个返回类型不同的模板函数

来自分类Dev

C ++函数模板格式

来自分类Dev

函数模板的C ++ Decltype

来自分类Dev

(Objective-)C ++模板专门化上的重复符号

来自分类Dev

使用c ++ 11 auto作为const函数对象的返回类型

来自分类Dev

使用c ++ 11 auto作为const函数对象的返回类型

Related 相关文章

  1. 1

    如何专门化C ++中的可变参数模板函数?

  2. 2

    如何基于类型相关的类型专门化C ++模板类函数?

  3. 3

    如何使C ++模板化函数与返回类型无关,以便将来进行专门化

  4. 4

    C++ - 在具有非类型模板参数的模板化类上专门化函数模板

  5. 5

    c ++未能专门化函数模板'iterator_traits'

  6. 6

    C ++-部分专门化模板类成员函数

  7. 7

    C ++-专门化类模板的成员函数

  8. 8

    C ++ 11函数模板专门存在于类方法中(如果存在)

  9. 9

    为什么C ++函数模板实例化的返回类型包含在错误的函数名称中?

  10. 10

    C ++在可变参数模板内部专门化可变参数模板

  11. 11

    C ++ 98中基于函数对象operator()签名的“过载”函数模板

  12. 12

    C ++ 98中基于函数对象operator()签名的“过载”函数模板

  13. 13

    为什么C ++函数模板在其签名中包含返回类型

  14. 14

    C ++:数组的功能模板专门化

  15. 15

    如何专门化模板成员函数?

  16. 16

    为一组类型专门化函数模板

  17. 17

    C++ 函数模板:必须使用 & 作为参数类型和返回类型吗?

  18. 18

    C ++接受函数作为模板以及函数返回类型的返回向量

  19. 19

    为什么不能在C ++模板中部分地专门化成员函数

  20. 20

    为什么不能在C ++模板中部分地专门化成员函数

  21. 21

    我该如何对使用模板化args的函数进行模板化,并在c ++中对其应用模板化函数?

  22. 22

    从成员类型推断类型的C ++函数模板?

  23. 23

    在Swift中,返回相同类型的函数的泛型函数使我“无法显式专门化泛型函数”

  24. 24

    C ++ 11:如何编写两个返回类型不同的模板函数

  25. 25

    C ++函数模板格式

  26. 26

    函数模板的C ++ Decltype

  27. 27

    (Objective-)C ++模板专门化上的重复符号

  28. 28

    使用c ++ 11 auto作为const函数对象的返回类型

  29. 29

    使用c ++ 11 auto作为const函数对象的返回类型

热门标签

归档