我正在为字符串编写比较器。但是我想让它适用于字符串和char * s。
像StringComparer<std::string, std::string>
和StringComparer<const char *, const char*>
之类的东西。当然,在Stringcomparer<const char *, const char *>
的实现中,我只需对两个字符串执行std::string Stringversion(<pass the const char* here>)
,只需调用Stringcomparer<std::string, std::string>
。
如何为StringComparer编写两个这样的模板化函数。
我一直在寻找这个,我到处都能看到的是人们定义了这样一个函数的例子:
template <typename T> foo(T&)
{
//some operation on T that does depends on operators or functions that can handle any //type like sort or cout. basically there are showing that this fucntion can be used to sort //both integer and string vectors or it can cout both integers and floats.
}
请告诉我如何提供stringcomparer的多种变体。当然,有些时候人们需要编写一个单独的例程来处理每种类型。这是如何完成的。
答案 0 :(得分:3)
您可以声明主要功能模板,并[完全]将其专门用于不同类型,例如:
template <typename T> void foo(T&); // primary template declaration
template <> void foo<std::string>(std::string& s) { // specialization for std::string
// ...
}
template <> void foo<char*>(char *&s) { // specialization for char*
// ...
}
请注意,专业化必须与主模板匹配,而专用类型必须完全替换!通常,我发现更容易专门化类模板实现函数对象(即,有一个函数调用操作符)并从一般函数模板委托给它们。
答案 1 :(得分:1)
您可以使用模板专精。这是一个简短的例子。
template <typename T>
void foo(const T& arg)
{
// code
}
// Specialises the function template for char*
template <>
void foo(const char*& arg)
{
// different code
}
编辑:糟糕,专门为字符串开头。