我可以默认这个Transform模板函数的返回类型吗?
Can I default the return type of this Transform template function?
目前,要使用以下…
template< class ResultCollection, class Collection, typename Transformation >
ResultCollection Transform(const Collection& c, Transformation t)
{
ResultCollection result(c.size());
transform(c.begin(), c.end(), result.begin(), t);
return result;
}
…您需要提供返回类型:
auto result = Transform< std::vector<int> >( someInputCollection, [] (SomeType& element) { return ElementToInt(element); });
是否有可能默认模板参数,以便默认情况下您将获得包含lambda返回的任何类型元素的向量?
I got to this:
template< class Collection, typename Transformation, class ResultCollection = std::vector< std::result_of_t<Transformation> > >
ResultCollection Transform(const Collection& c, Transformation t)
{
ResultCollection result(c.size());
transform(c.begin(), c.end(), result.begin(), t);
return result;
}
但这给了我这个:
C2783: 'ResultCollection Transform(const Collection &,Transformation)' : could not deduce template argument for 'ResultCollection'
我不知道如何修复它
您的代码有两个问题。第一个是缺失的typename
s:
class ResultCollection = std::vector< typename std::iterator_traits<typename Collection::iterator>::value_type >
^^^^^^^^ ^^^^^^^^
但是第二个问题是你传递了完全错误的类型!如果您的Transformation
实际上没有改变集合的值类型,那么这一切都很好,但是如果它这样做了呢?
std::vector<char> collection;
auto result = Transform(collection, [](char c) { return std::string(c, 1); });
您需要生成的vector
包含Transformation
给出的类型:
class ResultCollection = std::vector<
std::result_of_t<Transformation(decltype(*std::declval<Collection>().begin()))>
>
而且,顺便说一句,如果结果类型不是默认可构造的呢?你假设它在这里:
ResultCollection result(c.size());
可能需要这样做:
ResultCollection result;
result.reserve(c.size());
std::transform(c.begin(), c.end(), std::back_inserter(result), t);
或真的:
ResultCollection result;
result.reserve(c.size());
for (const auto& elem : c) {
result.push_back(t(elem));
}
您可以使用kennytm在此回答中提供的function_traits
来获取lambda的返回类型并将其设置为默认值。使用它你会得到
template <typename T>
struct function_traits
: public function_traits<decltype(&T::operator())>
{};
// For generic types, directly use the result of the signature of its 'operator()'
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
// we specialize for pointers to member function
{
enum { arity = sizeof...(Args) };
// arity is the number of arguments.
typedef ReturnType result_type;
template <size_t i>
struct arg
{
typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
// the i-th argument is equivalent to the i-th tuple element of a tuple
// composed of those arguments.
};
};
template< class Collection, typename Transformation, class ResultCollection = std::vector< typename function_traits<Transformation>::result_type > >
ResultCollection Transform(const Collection& c, Transformation t)
{
ResultCollection result(c.size());
transform(c.begin(), c.end(), result.begin(), t);
return result;
}
你可以看到它在这个实例中运行
相关文章:
- 检查函数返回类型是否与STL容器类型值相同
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 在 c++ 中将函数返回类型指定为模板参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 如何避免模板函数返回类型重复?
- 从类型bankAccount的返回值到函数返回类型int没有可行的转换
- 为什么在某些情况下从函数返回类型中删除 cv 限定符?
- 模板类内模板类的函数返回类型
- 为什么函数返回类型中不允许参数推导?
- 函数返回类型之前的"define"
- C++推断要隐式调用的模板函数返回类型
- 具有不同模板参数的函数返回类型
- 当函数返回类型为父类时,如何返回子类的对象?
- C++:在原型中声明"auto"函数返回类型仍然会导致在扣除错误之前使用"auto&quo
- C++14 'auto'能够获取函数返回类型,我们还需要 std::result_of<> 吗?
- 函数返回类型中的模板类型推断
- 嵌套模板类返回类型在 C++ 中的头文件中函数返回类型的语法
- C++重写 void 函数返回类型会导致生成失败
- 从函数内部推断函数返回类型
- C++嵌套类函数返回类型和命名空间