「アイ子先生」こと照崎アイ子は東京から山梨県にある山村の分校・森の水小学校分校に赴任してこの学校のたった一人の生徒・矢吹龍平を教えていたが、ここが山村留学の受け入れ先となったことで東京のあちこちから子供たちが生徒としてやって来る。子供たちの親は不満を漏らすが、結果的に子供たちは大きく成長し、教科書では伝えられないことまでもの人間性を身につけていく。アイ子は何度も窮地に立たされ、東京での失敗を胸につらみながらも、笑顔と必死な努力で生徒たちやみんなに救われる。他の職員たちも心情が変化していきアイ子の行動に理解を示していくとともに、生徒もやがて彼女に愛情や信頼を寄せていくのだった。しかし元々生徒数の少ない分校であるこの小学校は廃校の危機に立たされていた。それを知ったアイ子らは市長や教育委員会の人に嘆願するのだった。
フジテレビ系列で2005年1月11日から3月22日まで、毎週火曜日の22:00～22:54（第1回は22:10～23:14）に放送（沖縄テレビは火曜深夜（水曜未明）に時差放送、テレビ宮崎はネット無し）。主演は本作品が民放連続ドラマ初主演となった国仲涼子。東京から山梨県の山村の分校に赴任した女教師・照崎アイ子（国仲涼子）が、「山村留学」を通じて生徒たちとともに成長する姿を描く。このドラマの山村留学場面の撮影には、山梨県北杜市がセンター場面の撮影に地元の民家を提供するなどの協力をした。
SFINAEは元々、無関係なテンプレート宣言が（例えばヘッダーファイルのインクルードなどによって）存在する時に、不正なプログラムが作成されないようにするために導入された。しかし、その後、この挙動はコンパイル時のイントロスペクションに使うことができる、特に、テンプレートの実体化の際に、そのテンプレート引数が必要な特性を持っていることを検知することができることが発見された。例えば、次の例では、必要なtypedefが存在するかどうかを調べることができる。#include <iostream>template <typename T>struct has_typedef_foobar {    // yes型とno型はそれぞれサイズが異なり、sizeof(yes) == 1でsizeof(no) == 2である。    typedef char yes[1];    typedef char no[2];    template <typename C>    static yes& test(typename C::foobar*);    template <typename>    static no& test(...);    // test<T>(nullptr)を呼んだ結果のsizeofがsizeof(yes)と等しい場合、最初の多重定義が有効であるという意味で、    // つまりTはfoobarという入れ子型を持つことを検知できる    static const bool value = sizeof(test<T>(nullptr)) == sizeof(yes);};struct foo {        typedef float foobar;};int main() {    std::cout << std::boolalpha;    std::cout << has_typedef_foobar<int>::value << std::endl; // false（intは子にfoobarを持たない）    std::cout << has_typedef_foobar<foo>::value << std::endl; // true（foorは子にfoobarを持つ）}もし、型Tに入れ子型foobarが定義されていれば、最初の関数testの実体化が成功し、ヌルポインタ定数を渡すことができる（ので、返り値の型はyes型である）。 一方、もし実体化に失敗すれば、有効な関数は2番目のtestだけであり、返り値の型はno型になる。なお、この2番目の関数引数が...になっているのは、任意の引数を受け付けるためだけではなく、型変換の優先度が低いためである。これにより、2番目の関数より最初の関数が優先的に呼ばれることになり、型推論の曖昧さを回避することができている。C++11であれば、上記のコードは以下のように簡単にすることができる。#include <iostream>#include <type_traits>// どのようなテンプレート引数であってもvoidになるtemplate <typename... Ts> using void_t = void;template <typename T, typename = void>struct has_typedef_foobar : std::false_type {};template <typename T>struct has_typedef_foobar<T, void_t<typename T::foobar>> : std::true_type {}; // T::foobarが存在すれば、こちらが有効になるstruct foo {  using foobar = float;};int main() {  std::cout << std::boolalpha;  std::cout << has_typedef_foobar<int>::value << std::endl;  std::cout << has_typedef_foobar<foo>::value << std::endl;}C++17ではこの技法が標準化され、以下のようにさらに簡潔になった。#include <iostream>#include <type_traits>template <typename T>using has_typedef_foobar_t = decltype(T::foobar);struct foo {  using foobar = float;};int main() {  std::cout << std::boolalpha;  std::cout << std::is_detected<has_typedef_foobar_t, int>::value << std::endl;  std::cout << std::is_detected<has_typedef_foobar_t, foo>::value << std::endl;}Boostライブラリでは、boost::enable_ifなどをSFINAEを使って実装している。