我是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;
}
我想做同样的事情,但这次是为了一个功能。基本上是这样的:
myCont.sort<function>();
只是为了确定 - 我不想要这个:
#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 <class Func>
void sort(Func func)
{
bool result = func(val1,val2);
cout << result << endl;
return;
}
};
//Try for sort functor
template <typename R>
bool compare(const R& a, const R& b)
{
return a>b;
}
int main()
{
someContainer<int> myCont(7,6);
myCont.sort(compare<int>);
cin.ignore();
return 0;
}
/编辑:
我意识到我可能不太清楚。
我希望能够致电myCont.sort<function>
这可能吗?
我意识到函数不是你所谓的类,但是可以将泛型函数传递给sort():
#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 Ty>
void sort(bool (*_comp)(const Ty&, const Ty&))
{
cout << "Comp is of type: " << typeid(_comp).name() << endl;
cout << _comp(val1, val2) << endl;
return;
}
};
template <typename R>
bool compare(const R& a, const R& b)
{
return a>b;
}
int main()
{
someContainer<int> myCont(7,6);
myCont.sort(compare<int>);
cin.ignore();
return 0;
}
我甚至可以自定义其返回类型:
#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, typename Ty>
void sort(Ret (*_comp)(const Ty&, const Ty&))
{
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<bool,int>);
cin.ignore();
return 0;
}
但这不是问题。我知道我不是以最好的方式解释它,所以如果你想让我添加一些东西请告诉我什么。 我的想法是,我希望能够做到这样的事情: myCont.sort(); 要么 myCont.sort(功能);
问题的要点: 有没有办法将函数模板作为参数传递给另一个函数的模板 - 就像我将一个类模板作为参数传递给另一个函数的模板一样:
myCont.sort<Compare>(); // Compare is a template - not a template specialization
//later in sort we got Comp<T>()()
如果我有一个名为compare的函数模板,有办法执行以下任何操作:
myCont.sort<compare>();
myCont.sort(compare);
我想传递一个函数模板 - 不是比较的特化 - 我可以用仿函数来做这个,所以我想知道我是否可以用函数来做。 我不想要:
myCont.sort(compare<some_type>);
我想获取一个函数模板,然后在sort()中获得它的特化。
提前致谢!
P.S .:
似乎评论只是小尺寸所以这是另一个问题:
您是否认为使用此代码可以(myCont.sort(compare)
)(如果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 <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;
}
P.S。
一切都从我开始想知道为什么我不能编译它(显然是因为缺少someFunc,但是list.sort应该能够从列表专用的类型中推断出someFunc的类型是合乎逻辑的) :#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;
};
答案 0 :(得分:5)
C ++没有任何代表一组重载函数或函数模板的类型。传递一组函数的唯一方法是包含它们的类。
如果要传递单个函数(可能是模板函数实例),可以使用函数指针(或者甚至是引用)作为模板参数。但是函数的类型不能推导出来,它必须与模板参数的正式类型完全匹配。将它作为模板参数而不是普通参数传递的价值非常小 - 如果参数是常量,那么在内联期间,良好的编译器将优化函数指针直接调用,甚至内联也是如此。
对编辑的回应:
myCont.sort(compare)
工作。您只是在代码中犯了一个小错误,通过创建模板参数Ty
并且从不使用它。无法推断出未使用的参数。看看
顺便说一下,而不是这个
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;
}
};
以及自动生成模板化operator()
的新C ++ 14 lambdas。