加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 可变/不可变lambda的编译时开关

发布时间:2020-12-16 07:17:54 所属栏目:百科 来源:网络整理
导读:我正在编写一个类成员函数,它将在函数参数中使用给定类型为T的lambda.我的问题是:是否可以根据参数的可变性在编译时重载成员函数?以下是示例: // T is a given type for class.template typename Tclass Wrapper { T _t; // For T template typename F,ty
我正在编写一个类成员函数,它将在函数参数中使用给定类型为T的lambda.我的问题是:是否可以根据参数的可变性在编译时重载成员函数?以下是示例:

// T is a given type for class.
template <typename T>
class Wrapper {

  T _t;      

  // For T&
  template <typename F,typename R = std::result_of_t<F(T&)>>
  std::enable_if_t<std::is_same<R,void>::value> operator()(F&& f) {
    f(_t);
  }

  // For const T&
  template <typename F,typename R = std::result_of_t<F(const T&)>>
  std::enable_if_t<std::is_same<R,void>::value> operator()(F&& f) const {
    f(_t);
  }   
};

所以,我想要的是,如果给出lambda具有以下签名,则应该调用第一个运算符.

[](T&) {
    ...  
};

对于常量参数,应该调用第二个参数.

[](const T&) {
}

解决方法

如果你打算只使用非捕获lambdas,你可以依赖它们衰变到函数指针的事实.
它遵循一个最小的工作示例:

#include<type_traits>
#include<iostream>

template <typename T>
class Wrapper {
    T _t;      

public:
    auto operator()(void(*f)(T &)) {
        std::cout << "T &" << std::endl;
        return f(_t);
    }

    auto operator()(void(*f)(const T &)) const {
        std::cout << "const T &" << std::endl;
        return f(_t);
    }
};

int main() {
    Wrapper<int> w;
    w([](int &){});
    w([](const int &){});
}

否则,您可以使用两个重载函数,如下所示:

#include<type_traits>
#include<iostream>
#include<utility>

template <typename T>
class Wrapper {
    T _t;      

    template<typename F>
    auto operator()(int,F &&f)
    -> decltype(std::forward<F>(f)(const_cast<const T &>(_t))) const {
        std::cout << "const T &" << std::endl;
        return std::forward<F>(f)(_t);
    }

    template<typename F>
    auto operator()(char,F &&f) {
        std::cout << "T &" << std::endl;
        return std::forward<F>(f)(_t);
    }

public:
    template<typename F>
    auto operator()(F &&f) {
        return (*this)(0,std::forward<F>(f));
    }
};

int main() {
    Wrapper<int> w;
    w([](int &){});
    w([](const int &){});
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读