C++:模板专业化,std 映射选择了错误的专业化
C++: template specialization, std map choosing wrong specialization
我有一个模板可以根据它们的 stl 类型调用其他模板。使用 map<int, int>
工作正常,但是,如果我使用 map<int, std::string>
调用专业化,它会选择通用专业化,而不是地图专业化。我如何确保任何类型的地图( <int, int>
、 <int, string>
等)选择正确的专业化?
基本上是这样的,classA用了两个traits来特化
template<typename T, typename P=trait<T>>
class A{
public
typedef P traits
//
A(T a, T b){}
static T foo(T a, T b){
T d = traits::foo(a,b)
}
};
特质:
template<typename T>
struct trait{
static T foo(T a, T b){
//do something
}
};
template<typename T>
struct trait<std::map<T,T> >{
static std::map<T,T> foo(std::map<T,T> a, std::map<T,T> b){
//do something
}
};
主要内容:
std::map<int, std::string> a = {{1,"a"},{2,"b"}}
std::map<int, std::string> b = {{3,"c"},{4,"d"}}
A some_name(a,b);
some_name.foo(a,b);
您可以为映射的键和值使用不同的模板参数:
template<typename K, V>
struct trait<std::map<K,V> >{
static std::map<K,V> foo(std::map<K,V> a, std::map<K,V> b){
//do something
}
};
但这样做的问题是,对于具有自定义比较 类 或自定义分配器的映射,它将失败:
A<std::map<int, int>> // specialization for std::map
A<std::map<int, float>> // specialization for std::map
A<std::map<int, float, std::greater<int>>> // generic. Oops.
因此,您最好的选择实际上是使用可变参数模板进行专业化:
template<typename... Ts>
struct trait<std::map<Ts...> >{
static std::map<Ts...> foo(std::map<Ts...> a, std::map<Ts...> b){
//do something
}
};
我有一个模板可以根据它们的 stl 类型调用其他模板。使用 map<int, int>
工作正常,但是,如果我使用 map<int, std::string>
调用专业化,它会选择通用专业化,而不是地图专业化。我如何确保任何类型的地图( <int, int>
、 <int, string>
等)选择正确的专业化?
基本上是这样的,classA用了两个traits来特化
template<typename T, typename P=trait<T>>
class A{
public
typedef P traits
//
A(T a, T b){}
static T foo(T a, T b){
T d = traits::foo(a,b)
}
};
特质:
template<typename T>
struct trait{
static T foo(T a, T b){
//do something
}
};
template<typename T>
struct trait<std::map<T,T> >{
static std::map<T,T> foo(std::map<T,T> a, std::map<T,T> b){
//do something
}
};
主要内容:
std::map<int, std::string> a = {{1,"a"},{2,"b"}}
std::map<int, std::string> b = {{3,"c"},{4,"d"}}
A some_name(a,b);
some_name.foo(a,b);
您可以为映射的键和值使用不同的模板参数:
template<typename K, V>
struct trait<std::map<K,V> >{
static std::map<K,V> foo(std::map<K,V> a, std::map<K,V> b){
//do something
}
};
但这样做的问题是,对于具有自定义比较 类 或自定义分配器的映射,它将失败:
A<std::map<int, int>> // specialization for std::map
A<std::map<int, float>> // specialization for std::map
A<std::map<int, float, std::greater<int>>> // generic. Oops.
因此,您最好的选择实际上是使用可变参数模板进行专业化:
template<typename... Ts>
struct trait<std::map<Ts...> >{
static std::map<Ts...> foo(std::map<Ts...> a, std::map<Ts...> b){
//do something
}
};