gpt4 book ai didi

c++ - 可以在参数 C++ 中采用任何类成员的通用函数

转载 作者:太空狗 更新时间:2023-10-29 20:58:30 24 4
gpt4 key购买 nike

我要对类方法进行多项测试。我为此使用 std::function 有困难。这里有一个示例代码来简化问题:

#include <iostream>
#include <functional>

template<typename T>
struct Foo
{
Foo(T sum) : sum_(sum) {};
Foo<T> method_one(const Foo<T>& foo) const { Foo<T> res(sum_ + foo.sum_); return res; }
Foo<T> method_two(const Foo<T>& foo) const { Foo<T> res(sum_ + foo.sum_ + 10); return res; }
Foo<T> method_three(const Foo<T>& foo, T val) const { Foo<T> res(sum_ + foo.sum_ + val); return res;}
friend std::ostream &operator << (std::ostream & output, const Foo &foo) { output << foo.sum_; return output;}

T sum_;
};

template<typename T>
void do_the_work(const Foo<T>& a, const Foo<T>& b, const std::function<Foo<T>(const Foo<T>&)> &func)
{
// I do stuff before [...]
Foo<T> c = a.func(b);
std::cout << c << std::endl;
// I do stuff after [...]
}

int main()
{
Foo<float> a(1.0);
Foo<float> b(2.0);


// I would like to replace this
Foo<float> c = a.method_two(b);
std::cout << c; // 1 + 2 + 10


// with something like that
do_the_work(a, b, a.method_one);
do_the_work(a, b, a.method_two);
// and if possible make it more generic...
do_the_work(a, b, a.method_three, 12);
}

我尝试在 main() 中使用 bind 但没有成功:

std::function<Foo<float>(const Foo<float>&)> f = std::bind(&Foo<float>::method_one, &a);

任何其他优雅的解决方案都会很好。正如您所注意到的,这是为了防止代码冗余并多次执行“在之前或之后做的事情”

最佳答案

我将跳过在 do_the_work 的签名中使用 std::function 并在内部解析它。它使包含其他参数更容易:

template<typename T, typename Func, typename... Args>
void do_the_work(const Foo<T>& a,
const Foo<T>& b,
Func func,
Args&&... args)
{
auto f = std::bind(func, a, b, std::forward<Args>(args)...);

// I do stuff before [...]
Foo<T> c = f();
std::cout << c << std::endl;
// I do stuff after [...]
}

后来

do_the_work(a, b, &decltype(a)::method_one);
do_the_work(a, b, &decltype(a)::method_two);
// and if possible make it more generic...
do_the_work(a, b, &decltype(a)::method_three, 12);

关于c++ - 可以在参数 C++ 中采用任何类成员的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27470857/

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