c++ - 在 C++ 模板中将类型传递给 Lambda 函数
问题描述
我正在尝试std::transform
在模板功能中使用。由于模板函数需要处理的类型有很多种,关键部分是 lambda 函数的设计std::transform
。我想传递可迭代的基本类型T
来构造一个 lambda 函数。这里使用的实验代码使用gcc 10.2typename std::iterator_traits<T::iterator>::value_type
和MSVC 19.27 成功编译,但使用 clang 失败。
我换了之后
typename std::iterator_traits<T::iterator>::value_type
进入
typename std::iterator_traits<typename T::iterator>::value_type
问题似乎解决了。但是,我不确定这是否是正确的用法。此外,如果还有其他更好的方法可以做到这一点,请告诉我。
template<typename T>
concept ElementSummable = requires(T x)
{
x.at(0) + x.at(0);
};
template<typename T>
concept Iterable = requires(T x)
{
x.begin(); // must have `x.begin()`
x.end(); // and `x.end()`
};
template<class T> requires Iterable<T> && ElementSummable<T>
static T Foo(const T _input);
template<class T> requires Iterable<T> && ElementSummable<T>
static inline T Foo(const T _input)
{
T returnObject = _input;
std::transform(_input.begin(), _input.end(), returnObject.begin(),
[](typename std::iterator_traits<T::iterator>::value_type element)->typename std::iterator_traits<T::iterator>::value_type
{
return element + 1; // For example
}
);
return returnObject;
}
int main()
{
long double number = 1;
std::vector<decltype(number)> testVector1;
testVector1.push_back(number);
testVector1.push_back(number);
std::cout << Foo(testVector1).at(0);
return 0;
}
解决方案
推荐阅读
- javascript - 遍历 javascript 嵌套对象
- ruby-on-rails - Active Record 在一个查询中计算多个连接表?
- python - 如何将场景中的 QGraphicsItems 绘制到 QImage 上而不在 QGraphicsScene 中更改它们?
- python - 在 plone 中另一个项目的选择字段中列出创建项目的标题
- c++ - SFML,背景对象
- functional-programming - Spring Webflux 单声道
总是以成功的响应来响应 - typescript - Webpack 构建成功但缺少不可变导入?
- python - ValueError:负尺寸大小由 1 减去 2 导致的 'max_pooling3d_3/MaxPool3D'(op: 'MaxPool3D')输入形状 [?,1,60,60,128]
- python - pandas 按列值减法
- python - 如何使用 python 在 adb shell 中读写