【问题标题】:Elegant way to get value_type from referenced container C++从引用的容器 C++ 中获取 value_type 的优雅方式
【发布时间】:2020-07-25 08:59:06
【问题描述】:

我想从引用的容器中获取 value_type(例如std::string& str

我能够这样做的唯一方法是首先剥离引用,然后访问底层类型,这样:

std::unordered_set<std::remove_reference_t<decltype(str)>::value_type>

如果我使用的是 C++11,那就更糟了:

std::unordered_set<std::remove_reference<decltype(str)>::type::value_type>

我觉得它太冗长而且不是很干净。

STL中是否有任何模板可以以更简洁的方式进行这种操作?

【问题讨论】:

  • 试试decltype(*str.begin())
  • 另外,std::decay 更短,在这种情况下等效于std::remove_reference,所以std::decay_t&lt;decltype(str)&gt;::value_type
  • std::string::value_type 应该可以正常工作。有理由不直接做吗? (也就是说,这个问题是否缺少一个重要的约束?)
  • @PeteBecker,全部原因是不直接使用 std::string。例如如果我将参数类型更改为 std::wstring 我仍然希望它能够在不更改任何函数代码的情况下工作。
  • 编写自己的类型转换很容易。

标签: c++ templates stl


【解决方案1】:

C++20 添加了iterator trait aliases,允许您结合std::begin 及其兄弟姐妹来执行此操作。

您可以从中获取开始迭代器的任何 c 中的 value_type 名称,包括遗留的内置数组:

std::itr_value_t<decltype(std::begin( c ))>;

它只是有点短,所以也许把它做成一个模板元函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2014-09-01
    • 2011-08-02
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多