@九月
“简单”的解决方案
'sep' 发布的答案非常好,对于 99% 的应用程序开发人员来说可能已经足够好了,但如果它是库界面的一部分,可以使用一些改进,重复一遍:
专门用于矢量:
template<typename C> void mySuperTempalte (std::vector<C> myCont)
{
//check type of container
//do something here
}
如果调用者不使用 std::vector,这将起作用。如果这对你来说足够好,专门用于向量、列表等,那么就在这里停下来使用它。
更完整的解决方案
首先,请注意您不能部分特化函数模板——您可以创建重载。如果它们中的两个或多个匹配程度相同,您将得到“模棱两可的过载”错误。因此,我们需要在您想要支持的每种情况下准确匹配。
这样做的一种技术是使用 enable_if 技术—— enable_if 允许您使用晦涩的语言规则有选择地从可能的匹配列表中取出函数模板重载......基本上,如果某个布尔表达式为假,则重载变为“不可见” . 如果您好奇,请查阅 SFINAE 以获取更多信息。
例子。可以使用 MinGW (g++ parameterize.cpp) 或 VC9 (cl /EHsc parameterize.cpp) 从命令行编译此代码而不会出错:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
template <bool B, class T> struct enable_if {};
template <class T> struct enable_if<true, T> { typedef T type; };
template <class T, class U> struct is_same { enum { value = false }; };
template <class T> struct is_same<T,T> { enum { value = true }; };
namespace detail{
// our special function, not for strings
// use ... to make it the least-prefered overload
template <class Container>
void SpecialFunction_(const Container& c, ...){
cout << "invoked SpecialFunction() default\n";
}
// our special function, first overload:
template <class Container>
// enable only if it is a container of mutable strings
typename enable_if<
is_same<typename Container::value_type, string>::value,
void
>::type
SpecialFunction_(const Container& c, void*){
cout << "invoked SpecialFunction() for strings\n";
}
}
// wrapper function
template <class Container>
void SpecialFunction(const Container& c){
detail::SpecialFunction_(c, 0);
}
int main(){
vector<int> vi;
cout << "calling with vector<int>\n";
SpecialFunction(vi);
vector<string> vs;
cout << "\ncalling with vector<string>\n";
SpecialFunction(vs);
}
输出:
d:\scratch>parameterize.exe calling
with vector<int> invoked
SpecialFunction() default
calling with vector<string> invoked
SpecialFunction() for strings
d:\scratch>