在 C++ 模板中将类型传递给 Lambda 函数
Passing Type Into Lambda Function In C++ Template
我正在尝试在模板函数中使用 std::transform
。因为模板函数需要处理的类型是多种多样的,关键部分是std::transform
中lambda函数的设计。我想通过 iterable T
的基类型来构造一个 lambda 函数。这里的实验代码使用typename std::iterator_traits<T::iterator>::value_type
和it compile successfully with gcc 10.2 and MSVC 19.27 but failed with clang.
我替换后
typename std::iterator_traits<T::iterator>::value_type
进入
typename std::iterator_traits<typename T::iterator>::value_type
the problem seems to be solved。但是,我不确定这是否是正确的用法。此外,如果有其他更好的方法,请告诉我。
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;
}
问题是 CLang
编译器相对于标准的刚性。
问题不在于类型(这是正确的),问题在于您必须将类型名放在模板相关类型之前。
然而,最好的解决方案是使用 auto 让编译器自行推断类型。
我正在尝试在模板函数中使用 std::transform
。因为模板函数需要处理的类型是多种多样的,关键部分是std::transform
中lambda函数的设计。我想通过 iterable T
的基类型来构造一个 lambda 函数。这里的实验代码使用typename std::iterator_traits<T::iterator>::value_type
和it compile successfully with gcc 10.2 and MSVC 19.27 but failed with clang.
我替换后
typename std::iterator_traits<T::iterator>::value_type
进入
typename std::iterator_traits<typename T::iterator>::value_type
the problem seems to be solved。但是,我不确定这是否是正确的用法。此外,如果有其他更好的方法,请告诉我。
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;
}
问题是 CLang
编译器相对于标准的刚性。
问题不在于类型(这是正确的),问题在于您必须将类型名放在模板相关类型之前。
然而,最好的解决方案是使用 auto 让编译器自行推断类型。