【问题标题】:Specialize a function template in c++?用c ++专门化一个函数模板?
【发布时间】:2015-07-05 00:04:02
【问题描述】:

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

我有一个这样的模板:

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

Sel 类包含一个谓词函数来确定排序依据。

我想专门化排序功能,这样它就可以和我自己的SuchString类一起正常工作:

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

当我这样做时,我得到了错误:

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

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

感谢任何帮助。

【问题讨论】:

  • 不要使用函数特化。为此使用类专业化。并将调用分派给类的静态成员函数(模板和特化)。
  • 我不明白你的最后一段 - 你为什么不能将函数作为函数指针传递?您可以将其作为模板参数 - 这就是 std::sort 的工作原理。

标签: c++ function sorting templates predicate


【解决方案1】:

您的原始模板函数包含两种类型:

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

您正在尝试仅使用 one 类型对其进行专门化。因此错误。我不完全了解您在这里如何使用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& );

这样,如果fooSuchString 类型的左值,stringSort&lt;SomeSel&gt;(foo) 将调用SuchString&amp; 重载,否则将调用T&amp; 版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多