简体   繁体   English

在模板参数中传递向量

[英]Passing vector in template argument

I want to define a compare function so that it can be passed to std::sort. 我想定义一个比较函数,以便可以将其传递给std :: sort。 The comparision needs to be done based on the ordering of the vector x as demonstrated in 'compare_by_x' function below. 需要根据向量x的顺序进行比较,如下面的“ compare_by_x”函数所示。

template <std::vector<double> x>
bool compare_by_x(int i, int j){
  return x[i] <= x[j];
}

I want to pass the compare_by_x function as follows. 我想按如下方式传递compare_by_x函数。 This is not working. 这是行不通的。

std::sort(some_index_vector.begin(), some_index_vector.end(), compare_by_x<x>);

You cannot pass object references to template or to function. 您不能将对象引用传递给模板或函数。 But you can pass them to structs. 但是您可以将它们传递给结构。

Here is working example: 这是工作示例:

#include <iostream>
#include <vector>
#include <algorithm>

struct compare_by_x
{
    std::vector<double>& x;
    compare_by_x(std::vector<double>& _x) : x(_x) {}

    bool operator () (int i, int j)
    {
        return x[i] <= x[j];
    }
};

int main(int argc, const char *argv[])
{
    std::vector<double> some_index_vector;
    some_index_vector.push_back(0);
    some_index_vector.push_back(1);
    some_index_vector.push_back(2);
    std::vector<double> x;
    x.push_back(3);
    x.push_back(1);
    x.push_back(2);

    std::sort(some_index_vector.begin(), some_index_vector.end(), compare_by_x(x));

    for (std::vector<double>::const_iterator it = some_index_vector.begin(); it != some_index_vector.end(); ++it)
    {
        std::cout << *it << ' ';
    }
    std::cout << std::endl;

    return 0;
}

You simply cannot do that – templates are for types and a few compile-time constants only. 您根本无法做到这一点–模板仅适用于类型和一些编译时常量。

You need to take a look at the documentation of std::sort , which explains what kind of comparison function is expected as the third argument. 您需要看一下std::sort文档,文档解释了期望将哪种比较功能作为第三个参数。 Yours wouldn't work even if the template did miraculously compile. 即使模板奇迹般地编译,您的模板不起作用。

Luckily for you, the solution to your problem has already been posted on Stack Overflow . 幸运的是,您的问题的解决方案已经发布在Stack Overflow上

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM