我有一个char的initializer_list,想要将它强制转换为unsigned char的initializer_list:
// This code doesn't work, and it's used just as an example
reinterpret_cast<initializer_list<unsigned char>>(initializer_list<char>);
我该怎么做?
修改
这是我想要做的事情:
由于我是C ++的新手,我一直在尝试创建随机程序来学习它。我目前的目标是拥有一个继承自basic_string的类来实现ISO 8859-1。 但是basic_string中的一个构造函数被定义为
basic_string(initializer_list<charT> il, const allocator_type& alloc = allocator_type())
因此,为了实现以下功能(我目前看不到任何用处,我只是试图从类中实现所有内容)
// ISO_8859_1_String is a basic_string<unsigned char, ..., ...>
// where "..." are the other parameters, which are omitted to improve readability
ISO_8859_1_String testString{'a', 'b', 'c'};
我必须创建一个构造函数,它接收一个initializer_list字符并将其转换为ISO_8859_1_String的字符类型,这是unsigned char。这个问题进入了哪里。
ISO_8859_1_String(initializer_list<char> il,
const allocator_type& alloc = allocator_type()):
basic_string<unsigned char, ..., ...>
(magicFunctionToConvertCharILToUnCharIL(il), alloc){}
有没有办法可以做到这一点,可能使用辅助函数将initializer_list转换为其他东西,然后转换为所需的initializer_list?
解决方案:
正如@Brian所指出的,我可以使用initializer_list中的迭代器来调用basic_string的以下构造函数:
template <class InputIterator>
basic_string (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
所以我将构造函数修改为:
ISO_8859_1_String(initializer_list<char> il,
const allocator_type& alloc = allocator_type()):
basic_string<unsigned char, ..., ...>
(std::begin(il), std::end(il), alloc){}
答案 0 :(得分:1)
不,你试图执行的转换无法通过演员来完成 - 至少,不安全。此外,只有三种方法可以创建新的std::initializer_list
对象:
std::initializer_list<unsigned char> IL;
std::set<int> {1, 2, 3};
std::initializer_list<int> IL; IL = {1, 2, 3};
初始化初始化列表存在的唯一原因是初始化。初始化列表本身是无用的。它肯定不是一个很好的容器。如果您想使用initializer_list<char>
初始化unsigned char
的容器,请使用通常的范围构造函数。
std::initializer_list<char> IL {'a', 'b', 'c'};
std::vector<unsigned char> V(IL.begin(), IL.end());
答案 1 :(得分:1)
std :: string并不意味着是基类。它没有虚拟析构函数。相反,它是一个模板类,您可以专门为您的角色类型:
typedef std::basic_string<unsigned char> iso8859_1;