类型推导出模板函数返回类型

时间:2018-04-23 12:24:03

标签: c++ templates c++17 type-deduction

我正在编写一个模板函数,它使用std::minus返回向量的连续元素的差异。

目前我有以下代码:

template <typename T>
auto diffs(std::vector<T> &nums)
{
    typedef decltype(std::minus<T>()) diffType;
    std::vector<diffType> differences;
    differences.reserve(nums.size() - 1);
    auto test = std::back_inserter<std::vector<decltype (std::minus<T>())>>;
    std::transform(++begin(nums), end(nums), begin(nums), std::back_inserter(differences), std::minus<T>());

    return differences;
}

我正在使用

调用它
void test()
{
    auto values = std::vector<int>{ 1,2,4,6,89,1456 };
    auto differences = diffs(values);
}

当我编译这个时,我得到:

binary '=': no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)

如何声明我的typedef以便它与back_inserter一起正常使用?

1 个答案:

答案 0 :(得分:5)

此:

decltype(std::minus<T>())

要求构建minus<T>的默认类型,只是minus<T>。你想要的是你调用它时会发生什么:

decltype(std::minus<T>()(nums[0], nums[0]))

或者您可以使用类型特征:

std::invoke_result_t<std::minus<T>, T const&, T const&>