【问题标题】:C++ any iterator with a specific value type?C++ 任何具有特定值类型的迭代器?
【发布时间】:2017-10-18 01:16:58
【问题描述】:

假设我有一个函数模板来循环某个容器的任何迭代器:

template<class iter_type>
void f(iter_type start, iter_type finish)
{
   // loop from start to finish
}

现在问题是我知道那个容器的value_type(而f() 只对那个特定的value_type 有意义)。有没有办法限制iter_type 拥有特定的value_type

我可能可以从std::iterator 继承,但f() 只是一小段代码,不值得专门的类。

【问题讨论】:

  • 如果你知道容器类型,也许你可以专门研究它并参考它的::iterator类型。

标签: c++ templates iterator


【解决方案1】:

可以通过std::iterator_traits获取迭代器的value_type,然后在编译时查看,例如

template<class iter_type>
void f(iter_type start, iter_type finish)
{
    static_assert(
      std::is_same<
        typename std::iterator_traits<iter_type>::value_type,
        specific_value_type>::value, 
      "The value_type must be specific_value_type.");

    // loop from start to finish
}

LIVE

【讨论】:

    【解决方案2】:

    你可以使用std::enable_if:

    template<class iter_type>
    auto f(iter_type start, iter_type finish)
     -> typename std::enable_if<std::is_same<
                                typename std::iterator_traits<iter_type>::value_type,
                                particular_value_type
                                            >::value, void>::type
    {
       // loop from start to finish
    }
    

    这将使限制成为您函数签名的一部分,这意味着您可以拥有另一个具有相同名称和参数的函数模板,只要该特定 value_type 禁用它即可。

    编辑:使用 iterator_traits 使其更加健壮。

    【讨论】:

    • 如果我给它一个 value_types 不是 specific_value_type 的迭代器会发生什么?是生成什么都不做的函数,还是会出现编译时错误?
    • 会产生编译时错误。 enable_if 定义了一个类型 type,只有当它的第一个模板参数是 true 时,它才等于它的第二个模板参数(在这种情况下是 void)。由于我们使用type作为函数的返回类型,如果没有定义type,它将被错误定义。
    • @MetroWind 这意味着生成的错误并不是特别有用,所以如果您希望限制只是在您做错事时警告您,您可能应该使用松元瑶的解决方案。跨度>
    • 是的,我也在想同样的事情。鉴于 c++ 类型错误通常令人困惑(无论如何对我来说),自定义错误消息听起来很有吸引力。
    猜你喜欢
    • 2020-08-30
    • 1970-01-01
    • 2016-07-05
    • 2014-03-21
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    相关资源
    最近更新 更多