有一个非常类似于std::initializer_list
在标准 C++ 库不可用的环境中使用的实现:
template<typename T>
class initializer_list {
public:
using value_type = T;
using reference = const T &;
using const_reference = const T &;
using size_type = size_t;
using iterator = const T *;
using const_iterator = const T *;
private:
iterator m_array;
size_type m_length;
constexpr initializer_list( const_iterator array, size_type length ) noexcept : m_array( array ), m_length( length ) {}
public:
constexpr initializer_list( void ) noexcept : m_array( nullptr ), m_length( 0 ) {}
/* Number of elements */
constexpr size_type size( void ) const noexcept {
return m_length;
}
/* First element */
constexpr const_iterator begin( void ) const noexcept {
return m_array;
}
/* One past the last element */
constexpr const_iterator end( void ) const noexcept {
return begin() + size();
}
};
template<typename T>
constexpr const T * begin( initializer_list<T> list ) noexcept {
return list.begin();
}
template<typename T>
constexpr const T * end( initializer_list<T> list ) noexcept {
return list.end();
}
然后这样initializer_list<T>
将在另一个类构造函数中使用:
template<typename T>
struct user {
user( initializer_list<T> init_values ) { ... }
};
以及同时使用这两种东西的意图:
user<int> sample { 1, 2, 3, 4, 5 };
显然,编译器不知道如何推断大括号初始值设定项列表的类型,以便它使用上面实现的 initializer_list。我想应该实现某种演绎指南来连接我的 initializer_list 和大括号初始化列表的实现。但我不知道如何实施。
有人可以建议我如何实施所描述的扣除指南吗?