gpt4 book ai didi

c++ - 通过组合实现仿函数重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:30 27 4
gpt4 key购买 nike

给定一些现有的仿函数:

struct incr {
int operator()(int x) const { return x + 1; }
};

struct rep_str {
std::string operator()(const std::string& s) const { return s + s; }
};

我想知道是否有可能实现这样的目标:

auto f = overload<incr, rep_str>();
f(1); // returns 2
f("hello"); // returns "hellohello"

多个重载可能如下所示:

auto f = overload<fa, fb, fc, ...>();
// or...
auto g = overload<fa, overload<fb, overload<fc, ...>>>();

我在想也许可以将 SFINAE 与 std::result_of_t 或类似的东西一起使用,但还没有弄清楚如何。

最佳答案

您不需要花哨的东西:只需继承所有参数并使用using-declarations引入operator()来自基类。但是,在可变参数情况下,您不能在using-declaration 中进行包扩展,因此您必须使用递归方法,如下所示:

template <class... Ts>
struct overload {}; // only used for empty pack

template <class T>
struct overload<T> : private T {
using T::operator();
};

template <class T1, class T2, class... Ts>
struct overload<T1, T2, Ts...> : private T1, overload<T2, Ts...> {
using T1::operator();
using overload<T2, Ts...>::operator();
};

关于c++ - 通过组合实现仿函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38387720/

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