私は最近 C++11 をいじっていて、次の sum 関数を思いつきました:
template <typename T>
inline T sum(const std::function<T (int)> &f, int initial, int end)
{
T retval = 0;
for(int k = initial; k <= end; k++) {
retval += f(k);
}
return retval;
}
アイデアは、ラムダ関数を渡すことができるため、数学的な合計のためのきちんとした読みやすい関数を持つことができるということです。次に、次のことを試しました。
int main()
{
std::array<double, 2> arr1 = {{ 0.5, 1.5 }},
arr2 = {{ 1.5, -0.5 }};
auto n = sum<int>([&](int k) { return arr1[k]*arr2[k]; }, // Precision loss!
0, 1);
return 0;
}
これを g++ 4.6.3: を使用してコンパイルしg++ -Wall -pedantic -std=c++0x -o test main.cpp
ましたが、ソース コードのコメントで指摘した精度の低下に関する警告は表示されません。
ここでsum<int>
は、悪いことをするのはほとんど当然のことですが、より複雑な状況ではそれほど明白ではないかもしれません。コンパイラはラムダ関数の戻り値double
が int
それができない特定の理由はありますか?