首页 > 后端开发 > C++ > 正文

如何使用enable_if根据模板参数选择函数:为什么会出现'struct std::enable_if”中没有类型名为'type”的错误以及如何解决?

Susan Sarandon
发布: 2024-10-26 12:00:05
原创
562 人浏览过

How to Choose a Function Based on Template Parameters Using enable_if: Why does the

如何使用 Enable_if 根据模板参数选择函数

问题:

确定类成员的版本应基于类的模板参数调用函数可能具有挑战性。使用enable_if可以是一个解决方案,但可能会遇到“struct std::enable_if'中没有名为'type'的类型”之类的错误。

解决方案:

问题在于模板参数的替换。 enable_if 的工作原理是消除在模板参数替换期间导致错误的重载。在提供的代码中,不会发生替换,因为在成员函数实例化时 T 已知。

要解决此问题,请创建一个默认为 T 的虚拟模板参数,并将其用于 SFINAE(替换失败不是一个错误)。将有问题的代码替换为以下内容:

<code class="cpp">template<typename T>
struct Point
{
  template<typename U = T>
  typename std::enable_if<std::is_same<U, int>::value>::type
    MyFunction()
  {
    std::cout << "T is int." << std::endl;
  }

  template<typename U = T>
  typename std::enable_if<std::is_same<U, float>::value>::type
    MyFunction()
  {
    std::cout << "T is not int." << std::endl;
  }
};</code>
登录后复制

注意:

为了防止用户显式指定模板参数并可能获得不正确的结果,您可以添加静态对成员函数的断言,如以下示例所示:

<code class="cpp">template<typename T>
struct Point
{
  template<typename... Dummy, typename U = T>
  typename std::enable_if<std::is_same<U, int>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout << "T is int." << std::endl;
  }

  template<typename... Dummy, typename U = T>
  typename std::enable_if<std::is_same<U, float>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout << "T is not int." << std::endl;
  }
};</code>
登录后复制

以上是如何使用enable_if根据模板参数选择函数:为什么会出现'struct std::enable_if”中没有类型名为'type”的错误以及如何解决?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!