是否可以在C ++中对initializer_list进行类型转换?

时间:2014-05-05 01:38:07

标签: c++ initializer-list

我有一个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){}

2 个答案:

答案 0 :(得分:1)

不,你试图执行的转换无法通过演员来完成 - 至少,不安全。此外,只有三种方法可以创建新的std::initializer_list对象:

  1. 使用默认构造函数:std::initializer_list<unsigned char> IL;
  2. 使用braced-init-list语法:std::set<int> {1, 2, 3};
  3. 通过复制相同类型的另一个初始化列表:std::initializer_list<int> IL; IL = {1, 2, 3};
  4. 初始化初始化列表存在的唯一原因是初始化。初始化列表本身是无用的。它肯定不是一个很好的容器。如果您想使用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;