我正在尝试编写一个模板方法来处理STL容器中的项目。获取容器的详细信息很容易(我使用std::enable\u if子句,仅当容器可以迭代时(检测begin()方法),才允许调用此模板方法。)我还需要知道容器所持有的数据类型。以下是有效的方法:
template <typename CONTAINER>
std::string doStuff(const CONTAINER & container) {
using CONTAINER_TYPE = typename CONTAINER::value_type;
}
我可以使用
if constexpr
在这个方法中做某些事情,如果我还可以确定容器中保存的东西的类型。下面的代码不起作用,但就像我正在尝试的那样:
template <typename CONTAINER, typename ITEM>
std::string doStuff(const CONTAINER<ITEM> & container) {
using CONTAINER_TYPE = typename CONTAINER::value_type;
using ITEM_TYPE = typename ITEM::value_type;
}
为什么我不能以这种方式调用该方法,这完全有道理,但我可以做些什么(无论是在调用该方法时,还是在方法内部使用元编程)来确定容器中项目的类型。我希望在编译时知道它。
(我尝试了decltype和invoke\u result的两种排列,并进行了大量的搜索,但都没有什么效果。)例如,我尝试过:
using ITEM_TYPE = std::invoke_result<&CONTAINER::begin>::type;
当然,这会返回一个需要取消引用的迭代器类型,但这里的“*”似乎并不像预期的那样工作。