作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想要一个转换函数,它将某种算法应用于参数并返回转换后的结果。但是,它不一定必须更改返回类型,因此我想为调用者提供省略返回类型规范的选项,让编译器从输入类型中推导出它。
(简化)示例:
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
并且 In
和 Ret
类型是某种容器.因此我不能使用 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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!