Template class 作为模板参数默认参数
Template class as template parameter default parameter
今天我尝试将模板 class 传递给模板参数。我的模板classstd::map
有四个模板参数,但最后两个是默认参数。
我能够编译以下代码:
#include <map>
template<typename K, typename V, typename P, typename A,
template<typename Key, typename Value, typename Pr= P, typename All=A> typename C>
struct Map
{
C<K,V,P,A> key;
};
int main(int argc, char**args) {
// That is so annoying!!!
Map<std::string, int, std::less<std::string>, std::map<std::string, int>::allocator_type, std::map> t;
return 0;
}
不幸的是,我不想一直传递最后两个参数。写的实在是太多了。我如何在这里使用一些默认的模板参数?
您可以使用 type template parameter pack(C++11 起)允许可变模板参数:
template<typename K, typename V,
template<typename Key, typename Value, typename ...> typename C>
struct Map
{
C<K,V> key; // the default value of template parameter Compare and Allocator of std::map will be used when C is specified as std::map
};
然后
Map<std::string, int, std::map> t;
不理想,但是:
#include <map>
template<typename K, typename V, typename P,
typename A=typename std::map<K, V, P>::allocator_type,
template<typename Key, typename Value, typename Pr= P, typename All=A> typename C=std::map>
struct Map
{
C<K,V,P,A> key;
};
int main(int argc, char**args) {
Map<std::string, int, std::less<std::string>> t;
return 0;
}
今天我尝试将模板 class 传递给模板参数。我的模板classstd::map
有四个模板参数,但最后两个是默认参数。
我能够编译以下代码:
#include <map>
template<typename K, typename V, typename P, typename A,
template<typename Key, typename Value, typename Pr= P, typename All=A> typename C>
struct Map
{
C<K,V,P,A> key;
};
int main(int argc, char**args) {
// That is so annoying!!!
Map<std::string, int, std::less<std::string>, std::map<std::string, int>::allocator_type, std::map> t;
return 0;
}
不幸的是,我不想一直传递最后两个参数。写的实在是太多了。我如何在这里使用一些默认的模板参数?
您可以使用 type template parameter pack(C++11 起)允许可变模板参数:
template<typename K, typename V,
template<typename Key, typename Value, typename ...> typename C>
struct Map
{
C<K,V> key; // the default value of template parameter Compare and Allocator of std::map will be used when C is specified as std::map
};
然后
Map<std::string, int, std::map> t;
不理想,但是:
#include <map>
template<typename K, typename V, typename P,
typename A=typename std::map<K, V, P>::allocator_type,
template<typename Key, typename Value, typename Pr= P, typename All=A> typename C=std::map>
struct Map
{
C<K,V,P,A> key;
};
int main(int argc, char**args) {
Map<std::string, int, std::less<std::string>> t;
return 0;
}