首页  >  文章  >  后端开发  >  如何使用“enable_if”根据模板参数选择成员函数?

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

DDD
DDD原创
2024-10-25 19:06:39763浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn