10

標準コンテナーをラップするテンプレートがある場合、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 に与える」。

4

1 に答える 1