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

如何使用'enable_if”根据模板参数选择成员函数?

DDD
发布: 2024-10-25 19:06:39
原创
762 人浏览过

How to Select a Member Function Based on a Template Parameter Using `enable_if`?

使用 Enable_If 条件选择成员函数

任务是根据类模板参数确定成员函数的调用。以下代码片段尝试实现此目的:

<code class="cpp">#include <iostream>
#include <type_traits>

template<typename T>
struct Point
{
  void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T &>::type* = 0)
  {
    std::cout << "T is int." << std::endl;
  }

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

但是,此代码无法编译,并出现错误“'struct std::enable_if' 中没有名为 'type' 的类型”。

SFINAE 实践

理解这个问题的关键在于替换失败不是错误(SFINAE)的概念。 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>
登录后复制

防止显式成员函数特化

正如 HostileFork 所指出的,原始代码允许显式指定模板参数对于成员函数,这可能会导致不正确的结果。为了防止这种情况,我们可以添加一个 static_assert 来检查是否提供了任何模板参数。这确保了始终根据模板参数 T 调用正确的成员函数。修改后的代码为:

<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”根据模板参数选择成员函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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