にゃははー

はへらー

std::reference_wrapperをunwrapしたいけどダメだった・・・

タイトルの通りだけど、unwrapした型を取りたい。いやなにもstd::reference_wrapperだけでなく、他の変換関数を持ってるやつにも適用できるやつが欲しい。

で、試したけどダメだったのでアドバイスをもらえたらとか甘いこと考えてる。


とりあえず晒し

#include <cstdlib>
#include <functional>
#include <iostream>
#include <typeinfo>
#include <cxxabi.h>

template < typename T >
T deducer( T & );

template
<
  typename T,
  typename deduced = decltype( deducer( *reinterpret_cast< const T * >( 0 ) ) )
>
void unwrapper( const T & )
{
    char *name = abi::__cxa_demangle( typeid( deduced ).name(), nullptr, nullptr, nullptr );
    std::cout << name << std::endl;
    free( name );
}

int main( void )
{
    int i;
    unwrapper( std::ref( i ) );
}

出力

std::rerference_wrapper< int >

んーどうしたらいいんだろ。ってかテンプレートってconst関係なし・・・?そんなハズはないと思うんだがなぁ・・・
ってか今考えたらstd::refernece_wrapper< const int >とかだったらどうするんだ・・・。

std::reference_wrapperの特殊化とか書くのは美しくないし。