C++ 是否可以在C+中键入初始值设定项列表+;?

C++ 是否可以在C+中键入初始值设定项列表+;?,c++,initializer-list,C++,Initializer List,我有一个字符的初始值设定项列表,并希望将其键入一个未签名字符的初始值设定项列表: // This code doesn't work, and it's used just as an example reinterpret_cast<initializer_list<unsigned char>>(initializer_list<char>); //此代码无效,仅作为示例使用 重新解释转换(初始值设定项列表); 我该怎么做 编辑: 以下是我想做的: 因

我有一个字符的初始值设定项列表,并希望将其键入一个未签名字符的初始值设定项列表:

// 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())
basic\u字符串(初始值设定项\u list il,常量分配器\u type&alloc=allocator\u type())
因此,为了实现以下功能(我目前认为没有用,我只是尝试实现类中的所有内容)

//ISO_8859_1_字符串是一个基本字符串
//其中,“…”是其他参数,为了提高可读性而省略这些参数
ISO_8859_1_字符串测试字符串{'a','b','c'};
我必须创建一个构造函数,它接收一个初始值设定项字符列表,并将其转换为ISO_8859_1_字符串的字符类型,即无符号字符。这就是问题的切入点

ISO_8859_1_String(initializer_list<char> il, 
                  const allocator_type& alloc = allocator_type()):
    basic_string<unsigned char, ..., ...>
                 (magicFunctionToConvertCharILToUnCharIL(il), alloc){}
ISO_8859_1_字符串(初始值设定项列表),
常量分配器类型&alloc=allocator类型()):
基本字符串
(magicFunctionToConvertCharILToUnCharIL(il),alloc){}
有没有一种方法可以做到这一点,可以使用一个辅助函数将初始值设定项列表转换为其他内容,然后转换为所需的初始值设定项列表

解决方案:

正如@Brian所指出的,我可以使用initializer_list中的迭代器调用基本_字符串的以下构造函数:

template <class InputIterator>
    basic_string  (InputIterator first, InputIterator last,
             const allocator_type& alloc = allocator_type());
模板
基本\u字符串(先输入计数器,后输入计数器,
常量分配器类型&alloc=allocator类型();
因此,我将构造函数修改为:

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){}
ISO_8859_1_字符串(初始值设定项列表),
常量分配器类型&alloc=allocator类型()):
基本字符串
(std::begin(il),std::end(il),alloc){}

不,您尝试执行的转换无法通过强制转换来完成——至少不安全。此外,只有三种方法可以创建新的
std::initializer\u list
对象:

  • 使用默认构造函数:
    std::initializer\u list IL
  • 使用大括号的init list语法:
    std::set{1,2,3}
  • 通过复制相同类型的另一个初始值设定项列表:
    std::initializer\u list IL;IL={1,2,3}
  • 初始值设定项列表存在的唯一原因几乎是为了在初始化时方便。初始值设定项列表本身是无用的。这的确不是一个很好的容器。如果要使用
    初始值设定项\u list
    初始化
    无符号字符的容器,请使用常用的范围构造函数

    std::initializer_list<char> IL {'a', 'b', 'c'};
    std::vector<unsigned char> V(IL.begin(), IL.end());
    
    std::初始值设定项列表{'a','b','c'};
    向量V(IL.begin(),IL.end());
    
    std::string不应该是基类。它没有虚拟析构函数。相反,它是一个模板类,您可以为您的角色类型专门化它:

    typedef std::basic_string<unsigned char> iso8859_1;
    
    typedef std::basic_字符串iso8859_1;
    
    当你说“不起作用”-你是什么意思?确定
    重新解释\u cast
    ?我的意思是:错误:从类型“std::initializer\u list”到类型“std::initializer\u list”的无效转换请阅读。从基本_字符串继承不是有意的,也不是推荐的,可能会导致严重的问题。布瑞恩,请你自己做点好事,远离这个解决方案,尤其是当你在学习C++的时候。谢谢你的回答。基于此,我想我将无法完成我的目标,但我已经编辑了我的问题,以准确指出我想要从初始值设定项列表中得到什么。你介意检查一下吗?顺便说一句,如果我能将V(从你的答案)转换成初始值设定项列表,我就能做我想做的事情。@DanielCarvalho,使用
    basic\u string
    的范围构造函数。就像我在回答中建议的那样。这里是#7:是的,没错,但是如果我想使用像“iso8859_1 str=“test”这样的东西,我必须手工打字,像“iso8859_1 str=reinterpret_cast(“test”)”,但我希望它是“幕后的”。这就是为什么我继承了basic_string,然后扩展了它的功能来接受char。你可以给你的basic_string专门化一个接受const char*的构造函数,并在其中隐藏转换。从基本_字符串继承是错误的,如果您曾经通过指向基本_字符串的指针删除iso8859_1对象,则会导致未定义的行为。不要这样做。所以你的意思是,我应该在ISO类中有一个基本字符串成员,它不会从任何东西继承(在本例中),对吗?@DanielCarvalho是的,要么有一个包含基本字符串成员的包装类,要么有一个模板专门化。你刚才提到你正在学习C++,所以我认为到目前为止你还没有学习模板特化。在这种情况下,我会和会员一起去。你完全正确。今天晚些时候,我将研究模板专门化。非常感谢你的帮助!(不幸的是,我不能投票支持你,因为我没有必要的声誉)
    typedef std::basic_string<unsigned char> iso8859_1;