首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我应该在函数签名中避免使用std::enable_if

为什么我应该在函数签名中避免使用std::enable_if
EN

Stack Overflow用户
提问于 2013-01-30 17:07:28
回答 4查看 38.7K关注 0票数 174

Scott Meyer发布了他的下一本书EC++11的content and status,他在书中写道,书中的一条可能是“在函数签名中避免std::enable_if”。

std::enable_if可以用作函数参数、返回类型或类模板或函数模板参数,以便有条件地从重载解析中删除函数或类。

this question中,显示了所有三种解决方案。

作为函数参数:

代码语言:javascript
复制
template<typename T>
struct Check1
{
   template<typename U = T>
   U read(typename std::enable_if<
          std::is_same<U, int>::value >::type* = 0) { return 42; }

   template<typename U = T>
   U read(typename std::enable_if<
          std::is_same<U, double>::value >::type* = 0) { return 3.14; }   
};

作为模板参数:

代码语言:javascript
复制
template<typename T>
struct Check2
{
   template<typename U = T, typename std::enable_if<
            std::is_same<U, int>::value, int>::type = 0>
   U read() { return 42; }

   template<typename U = T, typename std::enable_if<
            std::is_same<U, double>::value, int>::type = 0>
   U read() { return 3.14; }   
};

作为返回类型:

代码语言:javascript
复制
template<typename T>
struct Check3
{
   template<typename U = T>
   typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
      return 42;
   }

   template<typename U = T>
   typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
      return 3.14;
   }   
};

  • 哪种解决方案应该是首选的,为什么我应该避免其他解决方案?
  • 在哪些情况下“避免在函数签名中使用std::enable_if”涉及到作为返回类型的使用(这不是普通函数签名的一部分,而是模板specializations)?
  • Are的一部分。成员函数模板和非成员函数模板有什么不同?
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14600201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档