gpt4 book ai didi

C++:模板特化,std 映射选择了错误的特化

转载 作者:行者123 更新时间:2023-11-28 04:30:38 25 4
gpt4 key购买 nike

我有一个模板可以根据它们的 STL 类型调用其他模板。使用 map <int, int>工作正常,但是,如果我用 map 调用特化 <int, std::string>它选择通用特化,而不是 map 特化。我如何确保任何类型的 map (<int, int><int, string> 等等)选择正确的特化?

基本上看起来是这样的,class A 使用两个 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
}
};

关于C++:模板特化,std 映射选择了错误的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53069161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com