【发布时间】:2014-01-12 16:18:33
【问题描述】:
是否可以让编译器根据类型特征在模板规范之间进行选择?例如,考虑比较函数的两种模板实现,一种用于顺序类型(strings、vectors、lists 等),另一种用于整数类型。我们可以为每一类类型只有一个模板特化吗?
template <class SeqT>
class Compare
{
public:
bool operator()(const SeqT& s1, const SeqT& s2) const
{
typename SeqT::const_iterator it1=s1.begin();
typename SeqT::const_iterator it2=s2.begin();
while(it1!=s1.end() && it2!=s2.end())
{
if(*it1<*it2) return true;
if(*it2<*it1) return false;
++it1; ++it2;
}
return it2!=s2.end();
}
};
template <class IntegerT>
class Compare
{
public:
bool operator()(IntegerT i1, IntegerT i2) const
{
return i1<i2;
}
};
template <class T, class Cmp = Compare<T> >
class SomeContainer
{
...
};
基本上,我正在寻找一种通过对模板参数施加条件来部分特化模板的方法。像第一个 Compare<> 特化应该应用于以下类型:std::basic_string<>、std::vector<>、std::list<>,第二个应用于以下类型:int、unsigned、short、char .这可能吗?
【问题讨论】:
-
是的。查看 std::enable_if
-
我首先想到了
std::enable_if,但我认为最好添加一个模板参数来指示类型的种类,并且可以从基本类型进行TMP“计算”。然后只需提供专业。 -
序列是什么意思——你是指任何可以使用
for (auto x : y)语法迭代的对象吗?
标签: c++ templates specialization