gpt4 book ai didi

c++ - 是否可以指定一个可选的返回类型并在未指定的情况下推导它?

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:19 26 4
gpt4 key购买 nike

我想要一个转换函数,它将某种算法应用于参数并返回转换后的结果。但是,它不一定必须更改返回类型,因此我想为调用者提供省略返回类型规范的选项,让编译器从输入类型中推导出它。

(简化)示例:

template <typename Ret = In, typename In, typename Func>
Ret transform(const In& in, Func f)
{
return f(in);
}

我想这样调用它:

auto result = transform(inValue, transformation); // 1
auto differentResult = transform<DifferentType>(inValue, transformation); // 2

请记住,这是简化的。实际上,我将 f 向前传递给 std::transform 并且 InRet 类型是某种容器.因此我不能使用 f 的结果或其他魔法来确定返回类型。当然,提供的示例将不起作用,因为这

typename Ret = In, typename In

是非法的。如果我反过来做:

typename In, typename Ret = In

在情况 1 中它会完全按照我的要求执行。但是我必须为情况 2 指定输入类型:

auto differentResult = transform<InType, DifferentType>(inValue, transformation);

这主要是个方便的问题,没办法,那就这样吧。看来我需要某种尾随模板类型说明符:)

真正的代码

template <typename Ret, typename In, typename Func>
Ret transform(const In& input, Func func)
{
Ret output{};
std::transform(std::cbegin(input), std::cend(input), std::inserter(output, std::end(output)), func);
return output;
}

对于上面的表单,我总是必须指定一个返回类型。我只是想知道如果没有给出 Ret 的模板参数,是否有一种方法可以从 input 中推断出它。

编辑:如果我提供两个重载,一个使用 2 个模板参数,另一个使用 3 个,它会起作用。我仍然想知道是否有可能只使用一个函数来做到这一点。

最佳答案

类似于 that ,简单的函数重载:

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

template <typename T>
std::ostream& operator<<( std::ostream& os, std::vector<T> const & vec ) {
for( auto & e : vec )
os << e << " ";
return os;
}

template <typename Ret, typename In, typename Func>
Ret transform_copy( In const& input, Func&& func) {
Ret output{};
std::transform( std::begin(input), std::end(input), std::inserter(output, std::end(output)), std::forward<Func>(func) );
return output;
}

template <typename In, typename Func>
In transform_copy( In const& input, Func&& func) {
return transform_copy<In,In,Func>(input, std::forward<Func>(func));
}

int main() {
std::string str = "abc";

auto r0 = transform_copy( str, [](char b) { return b+1;} );
std::cout << r0 << "\n";

auto r1 = transform_copy<std::vector<int>>( str, [](char b) { return b+1;} );
std::cout << r1 << "\n";

auto r2 = transform_copy<std::string>( r1, [](char b) { return b+1;} );
std::cout << r2 << "\n";
}

关于c++ - 是否可以指定一个可选的返回类型并在未指定的情况下推导它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22713417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com