日記だったり,備忘録だったり.
HAL研プロコン2008のページが公開されました.
プレエントリー完了.今年は石村さんに負けたくないなぁ
ウェブサイトあるのか.
http://www.city-okayama.ed.jp/~momos/
プールがきれいな学校でした.
焼き芋をした.
http://slashdot.jp/sp/binary2008/
shinhさんの7つのキーワードの内4つはすぐに見つかった.
あと1つは見つけないと...(http://shinh.skr.jp/m/?date=20081111#p08 )
たぶん,7つ見つけると
Y* w* b* a*. R* i* f*.
かな.
あと b*とR*かな.
template<typename T>
struct IntDouble
{};
template<>
struct IntDouble<int>
{
typedef double ReturnT;
static ReturnT call(int d)
{
return (double)d;
}
};
template<>
struct IntDouble<double>
{
typedef int ReturnT;
static ReturnT call(double d)
{
return (int)d;
}
};
template <typename ArgT>
typename IntDouble<ArgT>::ReturnT wrapper(ArgT arg)
{
return IntDouble<ArgT>::call(arg);
}
int main()
{
double d = wrapper(0);
int i = wrapper(0.0);
return 0;
}
かな.あきらかにタイプ数が増えててうーんですが.
double int_double(int d)
{
return (double)d;
}
int int_double(double d)
{
return (int)d;
}
template <typename RetT, typename ArgT>
RetT wrapper(ArgT arg)
{
return int_double(arg);
}
int main()
{
double d = wrapper(0); // error
int i = wrapper(0.0); // error
return 0;
}
(実際のコードは,int_doubleの部分がクラスで,テンプレート引数の入力を省略したくてwrapperを書いた)
こんな感じのコードがあった時に,wrapperのRetTはどっちも明らかなのに
コンパイラはRetTの型が分からんとエラーを吐きます.どうにかならないのかな.
void wrapper(Argt arg, RetT&ret)
とかが一番楽な気がしますが,事情があってこれはできなくて.それで
#define WRAPPER(ARG) int_double(ARG)
とかやると上のコードはOKなんですが
struct Bracket{
int operator[](int a){ return a;}
};
struct AddOne{
int operator,(int a){return a+1;}
};
...
WRAPPER( Bracket()[AddOne(),10] ); // error
WRAPPER( (Bracket()[AddOne(),10]) ); // ok
みたいにC++では合法だけど,C的にはうさんくさい式をつっこめなくなって困ります.
何かテンプレートをうまく使うとうまくいかないのかな.
今回は,wrapperをオーバーロードして逃げました.
Windows Vistaでこのフォルダの中にファイルとかフォルダを作ると
マイコンピュータの中に,作ったファイルとかが表示される.何だろこれ.
rtrace.txtとやらが現れたので気付いたのですが,こんなところに保存しないで欲しいなぁ
template<typename T>
struct Ret{};
template<>
struct Ret<int>{ typedef double Type;};
template<>
struct Ret<double>{ typedef int Type;};
template <typename ArgT>
typename Ret<ArgT>::Type wrapper(ArgT arg)
{
return int_double(arg);
}
返り値を教えてあげる構造体を用意したらうまくいった.
元の方のコードはかなりスッキリしたので,まぁOKでしょうか.