从迭代器中选择函数类型成员变量 目标 具有函数类型成员变量的类,可用于从由两个迭代器表示的值范围中选择值 应该在C++14中工作,但如果(更好的)解决方案只可能在17或20年内出现,我还是会感兴趣的 问题与解决方案草图
下面是设想的解决方案的示意图,其中从迭代器中选择函数类型成员变量 目标 具有函数类型成员变量的类,可用于从由两个迭代器表示的值范围中选择值 应该在C++14中工作,但如果(更好的)解决方案只可能在17或20年内出现,我还是会感兴趣的 问题与解决方案草图,c++,templates,std-function,C++,Templates,Std Function,下面是设想的解决方案的示意图,其中?表示choose函数的类型,我无法计算 模板 阶级制作人{ ???从;//一个函数中选择它×它→ E ... 公众: 生产者(?cf):从{cf}{}中选择_ E下一个(){ //从内部状态获取一组值(为简洁起见省略)。 //也可以是另一个容器,例如std::set。 向量值=。。。; 返回choose_from(values.begin(),values.end()); } } 接下来,我们将介绍这样一个制作人的一些示例使用示意图。一个只支持其中一个子集的
?
表示choose函数的类型,我无法计算
模板
阶级制作人{
???从;//一个函数中选择它×它→ E
...
公众:
生产者(?cf):从{cf}{}中选择_
E下一个(){
//从内部状态获取一组值(为简洁起见省略)。
//也可以是另一个容器,例如std::set。
向量值=。。。;
返回choose_from(values.begin(),values.end());
}
}
接下来,我们将介绍这样一个制作人的一些示例使用示意图。一个只支持其中一个子集的解决方案仍然可以
- 结合现有功能:
autop=Producer(标准::最大元素)`;
- 结合lambda函数:
autop=Producer([](自动开始,自动结束)){…});
- 结合自定义自由功能:
模板
E我的选择器(它开始,它结束){…}
自动p=生产者(我的选择器);
问题:
如何使代码工作,即成员变量的/a正确类型是什么
尝试与思考
- 我曾尝试使用
std::function
从中键入choose\u,但由于没有抽象迭代器类型(AFAIK),我基本上被困在std::function
- 如果
Producer::next()
中std::vector
的使用被泄露,我可以修复choose\u from
的类型来处理std::vector::iterator
s,但我更愿意隐藏内部细节
std::min_元素是一个函数模板,您无法单独使用它。函数模板有问题-它们不能作为模板参数或函数参数传递
如果您同意将其包装在通用lambda中,那么有一个通用的解决方案:
template<class E, class F>
class Producer {
F choose_from; // A function It - It → It
public:
Producer(F const& cf) : choose_from{ cf } {}
E next() {
std::vector<E> values{ 5, 2, 3 };
return *choose_from(values.begin(), values.end());
}
};
template<typename E, typename F>
auto make_producer(F const& cf) {
return Producer<E, F>(cf);
}
template<typename It>
It my_selector(It begin, It end) { return begin; }
int main() {
auto p1 = make_producer<int>([](auto from, auto to) { return from; });
cout << p1.next() << endl;
auto p2 = make_producer<int>([](auto from, auto to) { return std::min_element(from, to); });
cout << p2.next() << endl;
auto p3 = make_producer<int>([](auto from, auto to) { return my_selector(from, to); });
cout << p3.next() << endl;
}
模板
阶级制作人{
F choose_from;//函数It-It→ 信息技术
公众:
生产者(F const&cf):从{cf}{}中选择_
E下一个(){
std::向量值{5,2,3};
return*从(values.begin()、values.end())中选择_;
}
};
模板
汽车制造商(F const&cf){
收益生产者(cf);
}
模板
它是我的选择器(它开始,它结束){return begin;}
int main(){
自动p1=生成生产者([](自动从,自动到){从返回;});
可能无法使用template…
?否则std::function
可能是一个选项?如果您的用法是请从(values.begin()、values.end())
中选择,然后选择std::function
。。。