gpt4 book ai didi

c++ - 专门针对 STL 样式容器类型的函数

转载 作者:太空狗 更新时间:2023-10-29 21:09:01 24 4
gpt4 key购买 nike

如果我有一个类型 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 作为参数的函数进行专门化。


根据 MSalters answer :

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 成为解决歧义错误的最不首选版本)

最佳答案

根据定义,STL 容器有一个 typedef iterator,有 2 个方法 begin()end() 重新运行它们。此范围容器包含的内容。如果没有这样的范围,则它不是 STL 意义上的容器。所以我建议沿着(未检查)

template<typename CONTAINER>
void f(CONTAINER& c,
typename CONTAINER::iterator begin = c.begin(),
typename CONTAINER::iterator end = c.end())
{ }

关于c++ - 专门针对 STL 样式容器类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1904796/

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