在 main 中呼叫此函式的有效定義是什么:
- foo<float,double>(sqrtfunction<float>, floatList);
我想知道它是否使用模板類完成,但如果不將其稱為類的成員就不可能做到這一點?
編輯:
foo 是一個呼叫 sqrtfunction 的函式,該函式將 sqrtfunction 應用于“floatList”中的每個元素,并在這種情況下回傳 float 型別的串列(sqrtfunction 的型別)。而 foo 的輸出保存在 double 型別的向量實體中。
uj5u.com熱心網友回復:
你所描述的聽起來像std::transform:
#include <vector>
#include <algorithm>
#include <cmath>
#include <iostream>
int main() {
std::vector<float> x{1,2,3,4,5};
std::vector<double> y(x.size());
auto sqrt = [](double x){ return std::sqrt(x);};
std::transform(x.begin(),x.end(),y.begin(),sqrt);
for (const auto& elem : y) std::cout << elem << " ";
}
輸出:
1 1.41421 1.73205 2 2.23607
通常,std::transform適用于將一個元素轉換為另一個元素并將轉換后的元素分配到從 開始的范圍的任何一元運算y.begin()。當演算法將 的元素傳遞給 lambda時float,double就會發生從to的轉換x(并且因為它呼叫了double std::sqrt(double),所以結果是double)。
uj5u.com熱心網友回復:
ITNOA
我認為https://stackoverflow.com/a/69468033/1539100解決了您的問題。
但是如果你想寫模板函式,你可以寫這樣的東西
#include <cmath>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <functional>
template <typename T>
T my_sqrt(T value)
{
return std::sqrt(value);
}
template <typename I, typename ElementType>
auto sqrt_function(std::function<I(I)> sqrt_func, const std::vector<I>& elements) -> std::vector<ElementType>
{
std::vector<ElementType> results;
std::transform(elements.cbegin(), elements.cend(), std::back_inserter(results), sqrt_func);
return results;
}
int main()
{
std::vector<double> results = sqrt_function<float, double>(my_sqrt<float>, std::vector<float>(10, 9.f));
std::copy(results.cbegin(), results.cend(), std::ostream_iterator<double>(std::cout, ", "));
}
如果你想使用模板模板引數,你可以像下面這樣修改上面的代碼
template <typename I, template<typename> class List, typename ElementType>
auto sqrt_function(std::function<I(I)> sqrt_func, const List<I>& elements) -> std::vector<ElementType>
{
std::vector<ElementType> results;
std::transform(elements.cbegin(), elements.cend(), std::back_inserter(results), sqrt_func);
return results;
}
int main()
{
std::vector<double> results = sqrt_function<float, std::vector, double>(my_sqrt<float>, std::vector<float>(10, 9.f));
std::copy(results.cbegin(), results.cend(), std::ostream_iterator<double>(std::cout, ", "));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312607.html
