this example使用std::less/std::greater
的动机。
是否可以使用std::min
或std::max
作为模板比较器?
以下示例将引发错误:
error: type/value mismatch at argument 1 in template parameter list for 'template<class C> class Test'
#include <functional>
#include <algorithm>
template <typename C>
class Test
{
public:
int compare(int x, int y)
{
return C()(x, y);
}
};
int main() {
Test<std::min<int>> foo;
Test<std::max<int>> bar;
foo.compare(1, 2);
bar.compare(1, 2);
}
答案 0 :(得分:2)
std::min<int>
和std::max<int>
不是类型。它们是功能。
Test<std::min<int>>
Test
模板期望其参数是类(或者更确切地说是类型),而不是函数。模板声明为:
template <typename C> class Test
typename
表示模板参数是类/类型。
此外,模板声明了一个名为&#34; compare&#34;的方法。 main()
尝试调用名为&#34; run&#34;的方法。那将是另一个问题。
答案 1 :(得分:2)
注意std::min
和std::max
是功能模板。如果要将它们用作模板参数,则需要将它们声明为non-type template parameter,例如函数指针:
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2013_SP1" />
</soap:Header>
<soap:Body>
<m:Subscribe>
<m:PullSubscriptionRequest SubscribeToAllFolders="true">
<t:EventTypes>
<t:EventType>CopiedEvent</t:EventType>
<t:EventType>CreatedEvent</t:EventType>
<t:EventType>DeletedEvent</t:EventType>
<t:EventType>ModifiedEvent</t:EventType>
<t:EventType>MovedEvent</t:EventType>
<t:EventType>NewMailEvent</t:EventType>
</t:EventTypes>
<t:Timeout>5</t:Timeout>
</m:PullSubscriptionRequest>
</m:Subscribe>
</soap:Body>
</soap:Envelope>
答案 2 :(得分:1)
std :: min和std :: max是函数而不是类。可能使用Functor类模板来包装std :: min / max功能也是一个更好的选择,如下面的代码所示:
#include <iostream>
#include <functional>
#include <algorithm>
template <typename C>
class Test
{
public:
int compare(int x, int y)
{
return C()(x, y);
}
};
template<typename T>
class MinComp {
public:
T operator ()(T x, T y) {
return std::min<T>(x,y);
}
};
int main() {
Test<MinComp<int>> foo;
std::cout<<foo.compare(5, 2);
}