在c ++中专门化一个函数模板?

时间:2015-04-26 16:41:53

标签: c++ function sorting templates predicate

我必须创建一个泛型函数来对C ++中的字符串进行排序,我必须使用自己的字符串类(我已将其实现为SuchString)进行测试。

我有一个这样的模板:

template<typename T, class Sel>
void stringSort(T& lel);

Sel类包含一个谓词函数,用于确定要排序的内容。

我想专门研究排序功能,因此可以使用我自己的SuchString类正常工作:

template<>
void stringSort<SuchString&>(SuchString& string);

当我这样做时,我收到错误:

  

没有函数模板匹配函数模板特化“stringSort

专门化这样的功能的正确方法是什么?我不能简单地重载函数,因为我需要包含谓词函数的Sel类。我不能将此函数作为简单的指针参数传递 因为任务是使用模板。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您的原始模板功能包含两个类型:

template<typename T, class Sel>
void stringSort(T& lel);

您只是尝试使用一个类型来专门化它。因此错误。我并不完全理解你在这里使用Sel的方式。我假设你真的打算将其作为一个论点传递:

template<typename T, typename Sel>
void stringSort(T& lel, Sel predicate);

在这种情况下,更简单的做法是为SuchString提供重载:

template <typename Sel>
void stringSort(SuchString&, Sel );

重载将优先于模板。

如果您需要的是Sel上的静态方法,那么您只需要切换模板类型的顺序:

template <typename Sel, typename T>
void stringSort(T& );

template <typename Sel>
void stringSort(SuchString& );

这样,如果stringSort<SomeSel>(foo)SuchString&类型的左值,则foo会调用SuchString重载,否则会调用T&版本。