【发布时间】:2021-03-08 22:52:48
【问题描述】:
容器模板包含value_type typedef 是很常见的。这使得创建其他模板化代码变得容易,最近的概念,如果只给出Container而不是Container<T>,就能够提取T。
但是,并非所有容器(或其他模板类)都定义了这样的value_type,尤其是较旧的容器。
即使没有它,是否有可能到达包含的T?
我知道有一些技巧,比如“如果它是一个迭代器,那么 .begin() 应该返回那个类型的值”,但这对我们没有帮助。编写一个概念要求,检查一个类的.begin() 是否确实遵循迭代器的要求。
【问题讨论】:
-
我不认为这是可能的,没有一些先决条件(
value_type类型,begin()方法,T类型在模板参数列表的第一个位置......或其他东西否则)对于大多数但不是所有可能和可想象的容器都是如此。但是……也许我错了。 -
如果
typename std::iterator_traits<std::remove_cvref_t<decltype(begin(c))>>::value_type;无效,则begin(c)在技术上不是迭代器。在某些时候,您需要划清界限,您愿意在多大程度上支持类似于迭代器但不遵循现代技术要求的东西。 -
value_type 是什么 应该仔细考虑。我们可以在
ClassTemplate<T, ...>中得到T,从std::iterator_traits<std::remove_cvref_t<decltype(std::begin(cont))>>中得到value_type,或者得到std::remove_cvref_t<decltype(cont[0])>,但实际上你想要的是哪个?如果你只是想适应旧的容器设计,我认为使用operator[]的那个更好。 -
谢谢大家!我非常同意,只要有可能,最好改用容器类。
标签: c++ templates containers c++-concepts template-templates