C++14 で関数オブジェクトから関数ポインタを返すc_function を実装してみた
c_function についてははここら辺を参照して下さい。
これを C++14 でサクッと実装できないだろうかー、って事で以下の様なコードを書いてみたんですが、これを Clang 3.5(trunk) でコンパイルしてみたらコンパイラがエラー吐いた…。
[ソース]
#include <type_traits> #include <iostream> template<typename Uniq, typename F> auto c_function(Uniq, F func){ static auto func_ = func; return [](auto... args){ return func_(args...); }; } int main(){ auto value = 3; std::common_type<int(*)(int)>::type func = c_function([]{}, [&value](auto a){ return a + value; } ); std::cout << func(3) << std::endl; value = -2; std::cout << func(2) << std::endl; return 0; }
どうも static 変数をラムダ内から参照しているあたりがまずいみたい。
仕様的には変数をキャプチャをしなくてもラムダ内から static 変数を参照するのは問題なかったような気がするけども(うろ覚え。
しかし、その部分は別としても関数からジェネリックラムダを返して、それを関数ポインタで受け取るとかかなり詐欺臭い動きだなーこれ。
C++14 だとこんなコードも書けてしまうのがこわい。
こういうアグレッシブなコードを書いている時が一番楽しい。