此模板函式無法識別 lamda 的回傳型別,即使將其指定為 decommenting '->void'。
為什么會這樣?
我能做些什么來規避這個問題?
#include<iostream>
#include<array>
template<typename T, typename S, size_t SIZE>
void for_each(std::array<T,SIZE>& arr, S(*func)(int&))
{
for (auto i{0}; i != arr.size(); i)
func(arr[i]);
}
int main()
{
std::array<int, 5> five_elems{10, 20, 30, 40, 50};
for_each(five_elems, [](int& ref)/*->void*/{ref *= 2; std::cout << ref << ' '; });
//for (auto i : five_elems)
// i*=2;
for (const auto i : five_elems)
std::cout << i << ' ';
}
uj5u.com熱心網友回復:
您需要一個函式指標,但模板引數推導for_each中不會考慮隱式轉換(從 lambda 到函式指標),這會導致呼叫失敗。
您可以顯式執行轉換:
for_each(five_elems, static_cast<void(*)(int&)>([](int& ref)/*->void*/{ref *= 2; std::cout << ref << ' '; }));
或者
for_each(five_elems, [](int& ref)/*->void*/{ref *= 2; std::cout << ref << ' '; });
或者只是停止使用函式指標引數。您可以添加一個新的型別模板引數,然后直接添加 lambda。
template<typename T, size_t SIZE, typename F>
void for_each(std::array<T,SIZE>& arr, F func)
{
for (auto i{0}; i != arr.size(); i)
func(arr[i]);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467037.html
