如果我有一个包装标准容器的模板,似乎我可以相当轻松地委托初始化器列表构造函数:
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;
}
但它显然不适用于 T 作为“int”,或任何其他没有嵌套 value_type typedef 的类型。因此,我想使用某种enable_if或类似的技巧来使initializer_list构造函数不会被发出,除非T都定义了嵌套的value_type typedef,并且可以从std::initializer_list构造。
我尝试了以下方法,但它仍然不起作用,因为编译器(在我的例子中是 clang++ 3.1),当 T 为 int 时,仍然会遇到无效的 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 的初始化列表构造时,在 T 上为 T 的 value_type 提供初始化列表构造函数”。