(可选)支持模板的initializer_list构造,可能会包装容器
Optionally supporting initializer_list construction for templates maybe wrapping containers
如果我有一个包装标准容器的模板,似乎我可以合理地轻松地委派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;
}
但它显然不适用于 T 作为"int"或任何其他没有嵌套value_type typedef 的类型。所以,我想使用某种enable_if或类似的技巧来使initializer_list构造函数不被发出,除非 T 都定义了嵌套的 value_type typedef,并且可以从 std::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上给这个模板一个初始值设定项列表构造函数,当且仅当 T 具有 value_type typedef 并且可以从 T::value_type 的initializer_list构造"。
SFINAE 仅适用于模板参数替换(因此 SFINAE 中的 S)。以下作品:
template<typename T>
struct holder {
T t_;
holder() :
t_() {}
template<typename U = T>
holder(typename std::enable_if<std::is_constructible<U, std::initializer_list<typename U::value_type>>::value,
std::initializer_list<typename U::value_type>>::type values)
: t_(values) {}
};
如果未使用模板函数,则将为类型 int
(在您的示例中)实例化整个类,从而导致编译器错误。
请注意,如果使用额外的模板参数,可以使函数签名更好:
template<typename U = T, class = typename std::enable_if<std::is_constructible<U, std::initializer_list<typename U::value_type>>::value, bool>::type>
holder(std::initializer_list<typename U::value_type> values)
: t_(values) {}
相关文章:
- 有什么方法可以包装自动类型扣除的助推"tee"流的构造?
- 线程构造函数周围的可变参数模板包装器无法编译
- 具有值包装器的可变参数模板构造函数的类构造函数优先级
- C++-用与被包装数据相同的语法构造包装类
- C++-用和结构相同的语法围绕结构构造包装类
- 无法理解包装类的构造函数的声明
- 尝试构造包装器测量函数调用时间时出现问题
- Boost Python - 用参数包装构造函数
- 非默认可构造和 std::引用包装器替代项的序列化
- 标准库中是否有与 std::thread 的构造函数语义匹配的类型擦除函数包装器?
- 重构现有包装类,以使用与包装器本身相同的构造函数参数包装 T
- 如何为包装容器的模板类编写构造函数,其中容器可以是数组或向量
- SWIG - 如何使用采用'const double*'的构造函数将类包装为 python
- 将 C 结构工厂函数与其相应的 C++ 包装类构造函数合并
- 将C 模板构造函数包装在模板类中
- 如何声明包装器类型 X 的移动构造函数<T> noexcept 取决于is_nothrow_move_constructible<T>?
- (可选)支持模板的initializer_list构造,可能会包装容器
- 通过包装器对象的构造函数将依赖关系传递给包装器对象
- 如何使包装类将其构造函数参数转发到 std::vector 的构造函数?
- 通过c++中的包装器将arment列表传递给构造函数