標準コンテナーをラップするテンプレートがある場合、initializer_list コンストラクターをかなり簡単に委任できるようです。
template<typename T>
struct holder {
T t_;
holder() :
t_() {}
holder(std::initializer_list<typename T::value_type> values)
: t_(values) {}
};
たとえば、これは std::vector でうまく機能します。
int main(int argc, char* argv[]) {
holder<std::vector<int>> y{1,2,3};
return EXIT_SUCCESS;
}
しかし、「int」としての T や、ネストされた value_type typedef を持たないその他の型では、明らかに機能しません。したがって、ある種の enable_if または同様のトリックを使用して、T がネストされた value_type typedef を定義し、std::initializer_list から構築可能でない限り、initializer_list コンストラクターを発行しないようにしたいと思います。
私は次のことを試しましたが、T が int の場合、コンパイラ (私の場合は clang++ 3.1) が無効な T::value_type を引き続きトリップするため、まだ機能しません。
holder(typename std::enable_if<std::is_constructible<T, std::initializer_list<typename T::value_type>>::value, std::initializer_list<typename T::value_type>>::type values)
: t_(values) {}
概念を表現する方法に関する考えは、「T に value_type typedef があり、T::value_type の initializer_list から構築できる場合にのみ、T の value_type に対する初期化子リスト コンストラクターを T に与える」。