std::vector可以初始化为
std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"}; Reference
现在,如果想要为我的某个类型实现类似的功能,我该如何着手呢?我应该如何实现此功能的构造函数?
标准如何支持我实现这一点(参考标准将是最有帮助的)?基本上,如果你能教我它是如何在std::vector上实现的,那就足够了。
这也可以在C++11之前完成吗?
另外,我可以有一个POD结构类型初始化器列表,这样我就可以拥有不同类型的值来初始化我的类型吗?
发布于 2013-05-09 13:37:15
创建一个以std::initializer_list为参数的构造函数:
#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
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%,但你可以简单地使用统一初始化来得到你想要的:
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"};
}发布于 2020-06-19 16:19:04
如果有人仍然在寻找这个问题的另一个答案,那么你可以从typeid中获得好处,比如:
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
}https://stackoverflow.com/questions/16455029
复制相似问题