以下のコードに何か問題がありますか?
#include <iostream>
#include <type_traits>
template <typename T>
void assign_lambda(T&& f)
{
typedef typename std::remove_reference<T>::type functor_type;
typedef typename std::aligned_storage<sizeof(functor_type),
std::alignment_of<functor_type>::value>::type buffer_type;
static char store[sizeof(buffer_type)];
auto const p(new (store) functor_type(std::forward<T>(f)));
(*p)();
}
int main()
{
for (int i(0); i != 5; ++i)
{
assign_lambda([i](){ std::cout << i << std::endl; });
}
return 0;
}
ただし、これは非標準であり、危険である可能性があるのではないかと心配しています。
編集:なぜchar
あなたが尋ねる配列に初期化するのですか? ブロックが十分に大きいことが判明した場合、ヒープからサイズのブロックを割り当て、sizeof(buffer_type)
繰り返し割り当てのために再利用することができます (つまり、メモリ割り当ての繰り返しを避けます)。
void*operator new(std::size_t サイズ);
影響: new-expression (5.3.4) によって呼び出される割り当て関数 (3.7.4.1) は、そのサイズのオブジェクトを表すために適切に整列された size バイトのストレージを割り当てます。
ヒープから割り当てると、アライメントの問題は解消されると思います。