将泛型函数传递给模板

时间:2016-06-16 15:23:34

标签: c++ templates

我有以下问题:

当我将模板函数传递给另一个模板函数时,它不起作用,但当我将正常函数传递给模板函数时,它会正常编译,例如:

template<class It, class Pred>
It findif(It begin,It end, Pred pr){
    while (begin!=end && !pr(*begin))
        begin++;
    return begin;
}
bool p(const string& s){
    /* some code */
}

当我将p传递给findif它有效,但这不是:

template<class It, class Pred>
It findif(It begin,It end, Pred pr){
    while (begin!=end && !pr(*begin))
        begin++;
    return begin;
}
template<class T
bool p(const T& s){
    /* some code */
}

2 个答案:

答案 0 :(得分:1)

模板功能是功能的蓝图,它们本身并不具备功能。您必须实例化其中一个,以便编译器生成该特定实例。例如,您无法做到:

template<class It, class Pred>
It findif(It begin,It end, Pred pr) {
    while (begin!=end && !pr(*begin))
        begin++;
    return begin;
}

template<class T>
bool p(const T& s) {
    /* some code */
}

int main() {
  std::vector<int> v{1,2,3}; 
  findif(v.begin(), v.end(), p);
}

您必须首先实例化代码的函数模板才能被接受。也就是说,你必须提供明确的参数:

  findif(v.begin(), v.end(), p<int>);
                             ^^^^^^

答案 1 :(得分:0)

如果您希望保留模板并仍然推导出模板参数,那么通常的方法是使用仿函数:

struct p {
    template<class T>
    bool operator()(const T& s) const { /*...*/ }
};

// ...

findif(v.begin(), v.end(), p{});