gpt4 book ai didi

以迭代器为参数的 C++ 成员函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:41:51 30 4
gpt4 key购买 nike

我想写一个类test能够存储一个函数,该函数能够遍历由经典 [first,last) 标识的元素集合迭代器对,即:

template <typename T>
struct sum
{
template <typename I>
T operator()(I first, I last) const
{
T res = 0;
while (first != last)
{
res += *first;
++first;
}
return res;
}
};
//...
int main()
{
test<double> t;
t.set(sum<double>);
double a[] {1.,2.,3.};
std::cout << "Test (array) => " << t.call(a, a+3) << std::endl;
std::vector<double> v {1.,2.,3.};
std::cout << "Test (vector) => " << t.call(v.begin(), v.end()) << std::endl;
std::list<double> l {1.,2.,3.};
std::cout << "Test (list) => " << t.call(l.begin(), l.end()) << std::endl;
}

我想用 std::function , 但我没能做到这一点,因为我无法声明模板化迭代器对。一种可能的解决方法如下,但它仅适用于普通数组(例如 double[]double* ,如上述变量 a ),但不适用于其他容器(例如,如上述变量 vl ):

template <typename T>
class test
{
public:
template <typename F>
void set(F f)
{
f_ = f;
}
template <typename I>
T call(I first, I last) const
{
return f_(first, last);
}
private:
std::function<T(T*,T*)> f_;
};

关于如何获得正确行为的任何想法?

注意:我正在使用 GCC 4.9.2 --std=c++11 进行编译

非常感谢。

最佳答案

你真正想要的是能够构建一个:

std::function<T(FwdIter<T>, FwdIter<T>)>

哪里FwdIter<T>是一些满足 ForwardIterator 概念的类型删除类,并被取消引用为 T .为此,请查看 Boost.TypeErasure图书馆,我们可以在哪里做:

#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/operators.hpp>
#include <boost/mpl/vector.hpp>

using namespace boost::type_erasure;

template <typename T>
using FwdIter = any<
boost::mpl::vector<
copy_constructible<>,
incrementable<>,
dereferenceable<T>,
equality_comparable<>
>>;

有了这个和你对 sum 的定义,我能做到:

std::function<int(FwdIter<int>, FwdIter<int>)> f = sum<int>{};
std::vector<int> v = {1, 2, 3, 4, 5};

std::cout << f(v.begin(), v.end()) << std::endl; // prints 15

在你的test<T> , 你可以有一个 std::function<T(FwdIter<T>, FwdIter<T>)>成员根据需要。

关于以迭代器为参数的 C++ 成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27797852/

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