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

时间:2013-12-15 17:06:24

标签: c++ templates

我正在为字符串编写比较器。但是我想让它适用于字符串和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的多种变体。当然,有些时候人们需要编写一个单独的例程来处理每种类型。这是如何完成的。

2 个答案:

答案 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
}

编辑:糟糕,专门为字符串开头。