C_R*_*Rod 1 c++ templates stl metaprogramming
我正在尝试编写一个模板方法来处理 STL 容器中的项目。获取容器的详细信息很容易(并且我使用 std::enable_if 子句来允许仅当容器可以迭代时才调用此模板方法(检测到 begin() 方法。))我还需要了解数据容器所持有的类型。这是有效的:
template <typename CONTAINER>
std::string doStuff(const CONTAINER & container) {
using CONTAINER_TYPE = typename CONTAINER::value_type;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能以这种方式调用该方法是完全有道理的,但是我可以做什么(调用该方法或在方法内部进行元编程)来确定容器中项目的类型。我想这样做,以便在编译时就知道它。
(我已经尝试了 decltype 和 invoke_result 的几种排列以及大量的搜索,但还没有什么效果。)我尝试过例如:
using ITEM_TYPE = std::invoke_result<&CONTAINER::begin>::type;
Run Code Online (Sandbox Code Playgroud)
当然,这会返回一个需要取消引用的迭代器类型,但“*”在这里似乎没有按预期工作。
您可以使用模板模板参数:
template <template <class, class...> class CONTAINER, class ITEM, class... REST>
std::string doStuff(const CONTAINER<ITEM, REST...>& container) {
using CONTAINER_TYPE = ITEM; // or `typename CONTAINER<ITEM, REST...>::value_type`
// This requires SFINAE to not match `ITEM`s without `value_type`:
using ITEM_TYPE = typename ITEM::value_type;
//...
}
Run Code Online (Sandbox Code Playgroud)