テンプレートとオーバーロードとconst char * 型

C++のお話。
テンプレートの特殊化ってのを使って、
テンプレートクラス内のテンプレートメンバ関数を特殊化しようとしたが、
どうやら出来ない模様。なんでや!!


とりあえず、デフォルトの処理、ある型の場合は特別な処理、
という感じにわける事は出来るのかなー、と思ってこんなことやってみた。

#include <iostream>

template <typename T>
void test(const T val){
	std::cout << "default: " << val << std::endl;
}

void test(const char * val){
	std::cout << "const char * : " << val << std::endl;
}

void test(char * val){
	std::cout << "char * : " << val << std::endl;
}

int main(void){
	const char *x = "x";
	char y[] = "y";
	test(1); // int
	test("a"); // const char * ?
	test(x); // const char *
	test(y); // char [](char *)
	test(3.14); // double
	
	return 0;
}

default: 1
const char * : a
const char * : x
char * : y
default: 3.14


文字列"a"を変数に入れない場合は、const char *型なんだー
って思ったんだけど、参照を使って、

void test(const char * val)

void test(const char * &val)

に変えてみると、

default: 1
default: a
const char * : x
char * : y
default: 3.14

ってなる。


文字列"a"を変数にいれず、直接関数の引数に与えて呼び出すと、
const char * 型の参照としては扱えない、という発見があったわけです。
まぁ、参照にするメリットはあんまないんで、問題にはなってないんですけども。



osake oisii desu ^p^