gpt4 book ai didi

c++ - 是否可以使用默认泛型参数在 C++ 中定义 lambda?

转载 作者:可可西里 更新时间:2023-11-01 15:25:30 24 4
gpt4 key购买 nike

是否可以在 C++ 中使用默认泛型参数定义 lambda?

int main(){
auto lambda = [](auto i = 0){return i;};
std::cout<<lambda()<<"\n"; // this does not compile
std::cout<<lambda(4)<<"\n"; // this does compile
auto lambda2 = [](int i = 0){return i;};
std::cout<<lambda2()<<"\n"; // this is also OK
}

我想知道是否有可能重现像这个仿函数这样的东西,为什么不呢

struct Lambda{
template<typename T=int>
auto operator()(T i=1){ return i;}
};

最佳答案

你可以用包装器做到这一点:

template<class F, class DefaultArg>
struct DefaultArgWrapper
{
F f;
DefaultArg default_arg;

template<class... Args>
decltype(auto) operator()(Args&&... args) {
return f(std::forward<Args>(args)...);
}

decltype(auto) operator()() {
return f(default_arg);
}
};

template<class F, class DefaultArg>
DefaultArgWrapper<F, DefaultArg> with_default_arg(F&& f, DefaultArg arg) {
return {std::move(f), std::move(arg)};
}

int main(){
auto lambda = with_default_arg([](auto i){return i;}, 0);
std::cout<<lambda()<<"\n";
std::cout<<lambda(4)<<"\n";
}

另一种 C++17 解决方案:

template<class... F>
struct ComposeF : F... {
template<class... F2>
ComposeF(F2&&... fs)
: F(std::forward<F2>(fs))...
{}
using F::operator()...;
};

template<class... F>
ComposeF<std::decay_t<F>...> composef(F&&... fs) {
return {std::forward<F>(fs)...};
}

int main() {
auto lambda = [](auto i) { return i; };
auto f = composef(lambda, [&lambda](int i = 0) { return lambda(i); });
std::cout << f() << '\n';
std::cout << f(1) << '\n';
}

虽然有点次优,因为涉及 lambda 的两个拷贝:ComposeF 中的一个拷贝,另一个是原始 lambda在堆栈上。如果 lambda 是可变的,那将是一个问题。

关于c++ - 是否可以使用默认泛型参数在 C++ 中定义 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50762415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com