【问题标题】:How to specialize a function template with iterator traits?如何专门化具有迭代器特征的函数模板?
【发布时间】:2021-08-21 21:00:45
【问题描述】:
template <typename ForwIt>
typename std::iterator_traits<ForwIt>::value_type
foo(ForwIt begin, ForwIt end, double bar)
{
    using value_type = typename std::iterator_traits<ForwIt>::value_type;
    // value_type is the type of the values the iterator ForIt points to

    value_type baz;

    // Do stuff with the values in range [begin, end).
    // And modify baz;
    
    return baz;
}

int main()
{
    std::vector<int> numbers;
    for (int i = 0; i < 10; ++i)
        numbers.push_back(i);
    
    const std::vector<int> v0(numbers.begin(), numbers.end());
    const std::vector<float> v1(numbers.begin(), numbers.end());

    std::cout << foo(v0.begin(), v0.end(), 0.1) << ' ' <<
        foo(v1.begin(), v1.end(), 0.1) << std::endl;

    return 0;
}

foo 函数的返回类型的推导是value_type 被推导出来的。现在这适用于所有数字类型。

但是当value_type 是推导整数类型时,我希望返回类型(和baz 的类型)为double。在这种情况下如何进行专业化?

【问题讨论】:

    标签: c++ templates iterator specialization iterator-traits


    【解决方案1】:

    您可以避免专门化,或编写另一个重载。相反,您可以使用conditional_t根据某些条件选择特定类型

    // alias for convenience
    using T = typename std::iterator_traits<ForwIt>::value_type;
    
    // if T is int, value_type is double, otherwise it's just T
    using value_type = std::conditional_t<std::is_same_v<T, int>, double, T>;
    

    对于返回类型,只要使用auto,就会从baz的类型推导出正确的类型。

    这是demo

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 2018-06-06
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多