// 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的编译时开关所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)