首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过载局部lambda函数

过载局部lambda函数
EN

Stack Overflow用户
提问于 2017-04-10 08:26:36
回答 2查看 158关注 0票数 2

对于doubleint输入,我有一个几乎相同的函数。因此,我重载了这两种类型的函数。不幸的是,在核心部分,doubleint变体之间存在着差异。目前,我依赖于过载的“核心”函数。为了增强可读性,我希望将重载(非常短)的核心函数作为函数本身的一部分,例如使用lambda函数。

下面的示例总结了我当前的布局(当然,真正的代码涉及得更多一些)。

代码语言:javascript
复制
#include <iostream>
#include <cstdlib>

double func_core ( double a, double b ) {
  return a*b;
}

int func_core ( int a, int b ) {
  if ( a==b )
    return 1.;
  else
    return 0.;
}

template <class T> T func ( T a, T b ) {
  return func_core(a,b);
}

int main ( void ) {
  std::cout << func(10 ,20 ) << std::endl;
  std::cout << func(10.,20.) << std::endl;
  return 0;
}

出于本示例以外的原因,我使用C++14 (与此一致,我使用clang++ -std=c++14 example.cpp编译了这个示例)。

现在,我想去掉核心函数(本例中是func_core),因为它降低了代码的可读性。理想情况下,我希望使用在函数本身中重载的lambda函数。我在下面的示例中总结了我的想法(不工作)。

代码语言:javascript
复制
template <class T> T func ( T a, T b ) {
  if ( sizeof(T)==sizeof(int) )
    auto func_core = [](int a,int b){ if (a==b) return 1.; else return 0.; };
  else if ( sizeof(T)==sizeof(double) )
    auto func_core = [](double a,double b){ return a*b; };
  else
    throw std::runtime_error("Overload type not allowed");

  return func_core(a,b);
}

这能办到吗?还是我伸展过度了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-10 08:35:41

不幸的是,无论是用C++11还是C++14,你都会和像SFINAE这样的野兽玩,或者用过载的决议来满足你的需要。

然而,在C++17中,您可以使用constexpr if并将所有需要的功能合并到一个函数模板中,如下所示:

代码语言:javascript
复制
template<typename T>
 T func (T const &a, T const &b) {
  if constexpr(std::is_integral<T>::value)
    return (a == b)? 1 : 0;
  else
    return a * b;
}

现场演示

票数 5
EN

Stack Overflow用户

发布于 2017-04-10 08:37:42

您可以使用类型性状

代码语言:javascript
复制
template <class T> T func ( T a, T b ) {
    if (std::is_integral<T>::value)
        if (a==b) return 1;
        else return 0;
    else if (std::is_floating_point<T>::value)
        return a*b;
    else
        throw std::runtime_error("Overload type not allowed");
}

无论如何,我认为最好的方法是避免lambdas和使用正常的函数重载。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43318195

复制
相关文章

相似问题

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