如果我有一个类型T
,那么在编译时检查它以查看它是否是 STL 样式容器(对于任意值类型)的有用方法是什么?
(假设:指针、引用等已经被剥离)
起始代码:
template<class T> // (1)
void f(T&) {}
template<class T> // (2)
void f(std::vector<T>&) {}
void test()
{
int a;
std::vector<int> b;
f(a);
f(b);
}
现在这工作正常,但如果我想概括容器(即不定义(3),(4),...明确)?
使用SFINAE和类型列表会在一定程度上减少代码,但有更好的方法吗?
或者是否有基于概念的专业习语?
或者我可以以某种方式利用 SFINAE 来选择性地启用所需的专业化吗?
作为旁注,我不能使用迭代器 - 我正在尝试基于接收T
s 作为参数的函数进行专门化。
根据MSalters 的回答:
template<class T>
void f(T&, ...) {
std::cout << "flat" << std::endl;
}
template<class Cont>
void f(Cont& c, typename Cont::iterator begin = Cont().begin(),
typename Cont::iterator end = Cont().end()) {
std::cout << "container" << std::endl;
}
(需要变量参数列表来使第一个f
成为最不喜欢的版本来解决歧义错误)