首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现自定义类型的初始化列表?(类似于std::vector初始化器列表)

如何实现自定义类型的初始化列表?(类似于std::vector初始化器列表)
EN

Stack Overflow用户
提问于 2013-05-09 13:31:44
回答 2查看 11.9K关注 0票数 16

std::vector可以初始化为

代码语言:javascript
复制
std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"}; 

Reference

现在,如果想要为我的某个类型实现类似的功能,我该如何着手呢?我应该如何实现此功能的构造函数?

标准如何支持我实现这一点(参考标准将是最有帮助的)?基本上,如果你能教我它是如何在std::vector上实现的,那就足够了。

这也可以在C++11之前完成吗?

另外,我可以有一个POD结构类型初始化器列表,这样我就可以拥有不同类型的值来初始化我的类型吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-09 13:37:15

创建一个以std::initializer_list为参数的构造函数:

代码语言:javascript
复制
#include <vector>
#include <initializer_list>

template <typename T>
struct foo
{
private:
    std::vector<T> vec;

public:

    foo(std::initializer_list<T> init) 
      : vec(init)
    { }
};


int main()
{
    foo<int> f {1, 2, 3, 4, 5};
}

std::vector实现这一点的方式几乎完全相同(尽管利用begin()end() - std::initializer_list的迭代器与其他容器的方式大致相同)。来自gcc

代码语言:javascript
复制
  vector(initializer_list<value_type> __l,
     const allocator_type& __a = allocator_type())
  : _Base(__a)
  {
_M_range_initialize(__l.begin(), __l.end(),
            random_access_iterator_tag());
  }

编辑:我不是你想要做的100%,但你可以简单地使用统一初始化来得到你想要的:

代码语言:javascript
复制
struct bar
{
private:

    int i;
    double j;
    std::string k;

public:

    bar(int i_, double j_, const std::string& k_)
      : i(i_), j(j_), k(k_)
    { }

};

int main()
{
    bar b {1, 2.0, "hi"};
}
票数 32
EN

Stack Overflow用户

发布于 2020-06-19 16:19:04

如果有人仍然在寻找这个问题的另一个答案,那么你可以从typeid中获得好处,比如:

代码语言:javascript
复制
template <typename Type>
void check_type( Type par ){
   if( typeid(Type) == typeid(std::string()) ) {} //check for string type
   if( typeid(Type) == typeid(int) ){} //is int

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16455029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档