C++ 为每次处理特定类型的模板化函数提供多个实现

C++ 为每次处理特定类型的模板化函数提供多个实现,c++,templates,C++,Templates,我正在为字符串编写一个比较器。但是,我希望它同时适用于字符串和char*s。 类似于StringComparer和StringComparer的东西。当然,在Stringcomparer的实现中,我只需为这两个字符串执行std::string Stringversion,并简单地调用Stringcomparer 如何为Stringcomparer编写两个这样的模板函数 我一直在寻找这一点,我在任何地方都能找到这样的例子,人们定义了这样一个函数: template <typename T&g

我正在为字符串编写一个比较器。但是,我希望它同时适用于字符串和char*s。 类似于StringComparer和StringComparer的东西。当然,在Stringcomparer的实现中,我只需为这两个字符串执行std::string Stringversion,并简单地调用Stringcomparer

如何为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的多种变体吗。当然,有时人们需要编写一个单独的例程来处理每种类型。这是如何实现的

您可以使用模板专业化。下面是一个简短的例子

template <typename T> 
void foo(const T& arg)
{
    // code
}

// Specialises the function template for char*
template <> 
void foo(const char*& arg)
{
    // different code
}

编辑:Oops,专门用于字符串开头。

您可以声明一个主函数模板,并[完全]专门用于不同类型,例如:

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*
    // ...
}

请注意,专门化必须将主模板与专门化类型完全匹配!一般来说,我发现更容易专门化实现函数对象的类模板,也就是说,有一个函数调用操作符并从一个通用函数模板委托给这些对象。

为什么不只是重载?那么非标准基本_字符串呢?@KerrekSB最好问一下OP@KerrekSB我不能使用重载,因为我正在为已经存在的代码库编写代码,它需要模板化函数。已经实现了一个测试套件,您能解释一下您对非标准basic的查询吗_strings@Wildling:basic_string是一个模板,string是它的一个特定专门化。更自然的做法是创建一个适合所有基本字符串专门化并使用字符特征进行比较的函数。@KerrekSB谢谢,这是有道理的。