Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将函子或函数作为参数传递 我有点新的C++,我现在在用模板来更好地理解它们。以下是我一直在尝试的: #include <iostream> #include <typeinfo> using namespace std; template <typename T> class someContainer { private: T val1; T val2; public: someContainer(const T& in1, const T& in2) :val1(in1), val2(in2) {} template <template <typename Ty> class Comp> void sort() { bool result = Comp<T>()(val1, val2); cout << result << endl; return; } }; template <typename R> class Compare { public: bool operator () (const R& a, const R& b) { return a>b; } }; int main() { someContainer<int> myCont(7,6); myCont.sort<Compare>(); cin.ignore(); return 0; }_C++_Function_Templates_Functor - Fatal编程技术网

将函子或函数作为参数传递 我有点新的C++,我现在在用模板来更好地理解它们。以下是我一直在尝试的: #include <iostream> #include <typeinfo> using namespace std; template <typename T> class someContainer { private: T val1; T val2; public: someContainer(const T& in1, const T& in2) :val1(in1), val2(in2) {} template <template <typename Ty> class Comp> void sort() { bool result = Comp<T>()(val1, val2); cout << result << endl; return; } }; template <typename R> class Compare { public: bool operator () (const R& a, const R& b) { return a>b; } }; int main() { someContainer<int> myCont(7,6); myCont.sort<Compare>(); cin.ignore(); return 0; }

将函子或函数作为参数传递 我有点新的C++,我现在在用模板来更好地理解它们。以下是我一直在尝试的: #include <iostream> #include <typeinfo> using namespace std; template <typename T> class someContainer { private: T val1; T val2; public: someContainer(const T& in1, const T& in2) :val1(in1), val2(in2) {} template <template <typename Ty> class Comp> void sort() { bool result = Comp<T>()(val1, val2); cout << result << endl; return; } }; template <typename R> class Compare { public: bool operator () (const R& a, const R& b) { return a>b; } }; int main() { someContainer<int> myCont(7,6); myCont.sort<Compare>(); cin.ignore(); return 0; },c++,function,templates,functor,C++,Function,Templates,Functor,附言 顺便说一句,我一开始就想知道为什么我不能编译这个(显然是因为缺少someFunc,但合乎逻辑的是list.sort应该能够从列表专用的类型推断someFunc的类型): #包括 #包括 使用名称空间std; 样板 无效显示(常数T和输入) { 对于(自动i=input.cbegin();i!=input.cend();++i) coutC++没有表示一组重载函数或函数模板的任何类型。传递一组函数的唯一方法是作为包含它们的类 如果要传递单个函数(可能是模板函数实例),可以使用函数指针(甚至可

附言

顺便说一句,我一开始就想知道为什么我不能编译这个(显然是因为缺少someFunc,但合乎逻辑的是list.sort应该能够从列表专用的类型推断someFunc的类型):

#包括
#包括
使用名称空间std;
样板
无效显示(常数T和输入)
{
对于(自动i=input.cbegin();i!=input.cend();++i)

coutC++没有表示一组重载函数或函数模板的任何类型。传递一组函数的唯一方法是作为包含它们的类

如果要传递单个函数(可能是模板函数实例),可以使用函数指针(甚至可能是引用)作为模板参数。但函数的类型无法推导,它必须与模板参数的形式类型完全匹配。并且将其作为模板参数而不是普通参数传递没有什么价值——如果参数是常量,那么在内联过程中,一个好的编译器将优化函数指针直接调用,甚至内联调用


对编辑的答复:

myCont.sort(compare)
确实有效。您只是在代码中犯了一个小错误,使用了一个模板参数
Ty
,但从未使用过它。无法推断未使用的参数。请查看


顺便说一下,不是这个

template <typename R>
class Compare
{
public:
    bool operator () (const R& a, const R& b)
    {
        return a>b;
    }

};
模板
班级比较
{
公众:
布尔运算符()(常数R&a、常数R&b)
{
返回a>b;
}
};
你可能会喜欢

class Compare
{
public:
    template <typename R>
    bool operator () (const R& a, const R& b)
    {
        return a>b;
    }

};
类比较
{
公众:
样板
布尔运算符()(常数R&a、常数R&b)
{
返回a>b;
}
};

新的C++14 lambda自动生成模板化的
运算符()

C++没有任何表示一组重载函数或函数模板的类型。传递一组函数的唯一方法是作为包含它们的类

如果要传递单个函数(可能是模板函数实例),可以使用函数指针(甚至可能是引用)作为模板参数。但函数的类型无法推导,它必须与模板参数的形式类型完全匹配。并且将其作为模板参数而不是普通参数传递没有什么价值——如果参数是常量,那么在内联过程中,一个好的编译器将优化函数指针直接调用,甚至内联调用


对编辑的答复:

myCont.sort(compare)
确实有效。您只是在代码中犯了一个小错误,使用了一个模板参数
Ty
,但从未使用过它。无法推断未使用的参数。请查看


顺便说一下,不是这个

template <typename R>
class Compare
{
public:
    bool operator () (const R& a, const R& b)
    {
        return a>b;
    }

};
模板
班级比较
{
公众:
布尔运算符()(常数R&a、常数R&b)
{
返回a>b;
}
};
你可能会喜欢

class Compare
{
public:
    template <typename R>
    bool operator () (const R& a, const R& b)
    {
        return a>b;
    }

};
类比较
{
公众:
样板
布尔运算符()(常数R&a、常数R&b)
{
返回a>b;
}
};

新的C++14 lambda自动生成一个模板化的
操作符()

那么你的问题是什么?对不起,14.3.3/1:“模板模板参数的模板参数应该是类模板或别名模板的名称,用id表达式表示。”所以函数模板不能像类模板那样是模板参数。那么你的问题是什么?对不起,14.3.3/1:“模板模板参数的模板参数应该是类模板或别名模板的名称,用id表达式表示。”所以函数模板不能像类模板那样是模板参数。非常感谢这个答案!我刚刚学习了模板,所以我真的想用它们来尝试不同的东西。我不想传递模板函数实例-我想传递函数模板。@lightxbulb:我理解。这就是我为什么在我的第一段中明确指出,它们是传递整个函数族的唯一途径(函数模板就是这样的)就是把它们放在一个类中并传递给该类。@lightxbulb:请看我的编辑对您对问题所做的更改的回应。啊-那个错误-我在编写示例时忘记了更改。但是我仍然无法用VS2012运行它,我想您可以用gcc运行它…我得到了这个:
错误C4519:默认模板参数只允许在类模板上使用
,所以我想这是编译器的不同之处。事实上,这是我尝试做的第一件事——但它不起作用,对我来说似乎很奇怪,所以我尝试寻找变通方法(这就是我如何找到函子方法的原因)——我的意思是这就是我的问题的根源——我想几年后他们可能会在VS2012中实现它(当前无法将默认参数传递给函数)Oops:“当前无法将默认参数传递给函数”-意思是“当前无法将默认参数传递给函数模板”。也感谢Ideone网站!非常感谢这个答案!我刚刚学习了模板,所以我真的想用它们来尝试不同的东西。我不想传递一个模板函数实例-我想传递一个函数模板。@lightxbulb:我理解。这就是为什么我在第一段中解释说,它们只是y传递整个函数族(函数模板就是这样的)就是把它们放在一个类中并传递给该类。@lightxbulb:请看我的编辑对您对问题所做的更改的回应。啊-那个错误-我在编写示例时忘记了更改。但是我仍然无法用VS2012运行它,我想您可以用gcc运行它…我得到了这个:
错误C4519:默认模板参数只允许在类模板上使用
,所以我想
myCont.sort<Compare>(); // Compare is a template - not a template specialization
//later in sort we got Comp<T>()()
myCont.sort<compare>();
myCont.sort(compare);
myCont.sort(compare<some_type>);
#include <iostream>
#include <typeinfo>
using namespace std;

template <typename T>
class someContainer
{
private:
    T val1;
    T val2;
public:
    someContainer(const T& in1, const T& in2)
        :val1(in1), val2(in2) {}

    template <typename Ret = bool ,typename Ty = T>
    void sort(Ret (*_comp)(const T&, const T&))
    {
        cout << "Comp is of type: " << typeid(_comp).name() << endl;
        cout << _comp(val1, val2) << endl;
        return;
    }
};

template <typename Ret, typename R>
Ret compare(const R& a, const R& b)
{
    return a>b;
}

int main()
{
    someContainer<int> myCont(7,6);
    myCont.sort(compare); 

    cin.ignore();
    return 0;
}
#include <iostream>
#include <list>
using namespace std;

template <typename T>
void display(const T& input)
{
    for(auto i = input.cbegin(); i!=input.cend(); ++i)
        cout << *i << ' ';
    cout << endl;
    return;
}

template <typename R>
bool someFunc(const R& in1, const R& in2)
{
    return in1>in2;
}

int main()
{
    list<int> myList;
    myList.push_back(5);
    myList.push_back(137);
    myList.push_back(-77);
    display(myList);

    myList.sort(someFunc); //change it to myList.sort(someFunc<int>) and it works
    //however I believe the compiler should be able to infer the type of someFunc from
    //the type of myList - I guess the STL just wasn't written for having template 
    //functions as a binary predicate
    display(myList);

    cin.ignore();
    return 0;

};
template <typename R>
class Compare
{
public:
    bool operator () (const R& a, const R& b)
    {
        return a>b;
    }

};
class Compare
{
public:
    template <typename R>
    bool operator () (const R& a, const R& b)
    {
        return a>b;
    }

};