![](/img/trans.png)
[英]Passing type information to function in lieu of virtual template function C++
[英]Passing Type Into Lambda Function In C++ Template
我正在嘗試在模板函數中使用std::transform
。 因為模板函數需要處理的類型多種多樣,所以關鍵部分是std::transform
lambda 函數的設計。 我想傳遞可迭代T
的基類型來構造一個 lambda 函數。 此處的實驗代碼使用typename std::iterator_traits<T::iterator>::value_type
並使用 gcc 10.2 和 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.