template のノリで generic を使えなかったでござる(いやまぁそうなんだけど)

諸事情で C++/CLI を利用しています。 良いカオスっぷりですねコレ(ぉ

C++/CLI についてはよく知らない…ってか、C# も詳しく知らないわ、.NET についても詳しくない中ガリゴリ書いているのですが…


やっぱり、template と generic は違うんだなぁーと実感したコード。

// C++/CLI
void func(array<int>^ i)
{

}

void func(array<float>^ t)
{

}

generic<typename T>
void func2()
{
	array<T>^ tag = gcnew array<T>(1);
	func(tag); // C2665
}

void test()
{
	func2<int>();
}
error C2665: 'jvmcli::func' : 2 オーバーロードのどれも、すべての引数の型を変換できませんでした
        'void func(cli::array ^)' の可能性があります。
        with
        [
            Type=int
        ]
        または 'void func(cli::array ^)'
        with
        [
            Type=float
        ]
        引数リスト '(cli::array ^)' を一致させようとしているとき


なんて怒られてしまいました(苦笑 orz

そりゃ確かに、静的には決まらないからなぁー




ちなみに、上記のコードの generic を template にすると普通に通ります。 そりゃ静的に型が決まりますからなぁー

// C++/CLI
void func(array<int>^ i)
{

}

void func(array<float>^ t)
{

}

// OK
template<typename T>
void func2()
{
	array<T>^ tag = gcnew array<T>(1);
	func(tag);
}

void test()
{
	func2<int>();
}

で、generic な T で 呼ぶ関数を分ける / tag dispatch チックなコトするにはどうすりゃいいんっすかね。(ぉ orz