decltypeでconstを外したい

const T &hogeをdecltype(hoge)とするとdecltypeはconst になってしまう。constを外すのにはconst_castが必要なのだが、これには型の名前が必要となるため、型の名前を変数から得ようとしているのにこれでは本末転倒となってしまう。
というわけでとりあえずこんなコードを書いてみた。noncopyableでも動くか試すためにnoncopyableにしたけれど、それには大した意味はない。std::declval()だとこれまたconstな値が返ってきてdecltype( std::declval())....だと無理っぽい?

#include<iostream>
#include<boost/noncopyable.hpp>

class Hoge : public boost::noncopyable
{
public:
	int m_;
};

template<class T>
T const_cast_declval(const T& t);

void hoges(const Hoge &hoge)
{
	decltype(const_cast_declval(hoge)) h;
	h.m_ = 13;
}

int main()
{
	Hoge h;
	h.m_ = 1231;
	hoges(h);
	return 0;
}

まぁ、今夜浮かぶコードはこんな感じということで。今のところはこれで満足。あまりスマートじゃないなぁと思ったり。何かもっと感嘆にできそう.....(特にオレオレ関数作ってる辺りがアレ)

追記
本の虫さんの http://cpplover.blogspot.com/2009/08/decltype_20.html この記事なんかはとても参考になりました