从迭代器中选择函数类型成员变量 目标 具有函数类型成员变量的类,可用于从由两个迭代器表示的值范围中选择值 应该在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
。。。