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

c – 可变不可变lambda的编译时开关,第1张

概述我正在编写一个类成员函数,它将在函数参数中使用给定类型为T的lambda.我的问题是:是否可以根据参数的可变性在编译时重载成员函数?以下是示例: // T is a given type for class.template <typename T>class Wrapper { T _t; // For T& template <typename F, typen @H_419_4@ 我正在编写一个类成员函数,它将在函数参数中使用给定类型为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&) {}
@H_419_4@解决方法 如果你打算只使用非捕获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 &){});}
@H_419_4@ @H_419_4@ @H_419_4@ @H_419_4@ 总结

以上是内存溢出为你收集整理的c – 可变/不可变lambda的编译时开关全部内容,希望文章能够帮你解决c – 可变/不可变lambda的编译时开关所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1228434.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存