使用 braced-init 初始化 std::shared_ptr<std::map<>>
Initialising std::shared_ptr<std::map<>> using braced-init
我有以下 shared_ptr
到 map
:
std::shared_ptr<std::map<double, std::string>>
并且我想使用 braced-init 来初始化它。可能吗?
我试过:
std::string s1("temp");
std::shared_ptr<std::map<double, std::string>> foo = std::make_shared<std::map<double, std::string>>(1000.0, s1);
但是使用 Xcode 6.3 编译时出现以下错误:
/usr/include/c++/v1/map:853:14: Candidate constructor not viable: no known conversion from 'double' to 'const key_compare' (aka 'const std::__1::less<double>') for 1st argument
我尝试了第一个参数 (1000.0) 的其他变体,但没有成功。
有人能帮忙吗?
类似于此的东西应该可以做到...
std::string s1("temp");
std::map<double, std::string> *m = new std::map<double, std::string>{{100., s1}};
auto foo = std::shared_ptr<std::map<double, std::string>>(m);
或作为单线
auto foo2 = std::shared_ptr<std::map<double, std::string>>(new std::map<double, std::string>{{100., s1}});
(抱歉,第一次错过了初始化列表的要求)
更改密钥类型。
double
是一个不好的键类型,因为它没有 operator==
并且不同的字节序列可以表示相同的浮点值。
你的问题是你实际上没有在你的初始值设定项中放置任何大括号。我需要以下内容才能使其正常工作:
auto foo = std::make_shared<std::map<double, std::string> >(
std::map<double, std::string>({{1000.0, s1}})
);
双重 std::map<double, std::string>
让我很烦。它真的应该能够在给定另一个的情况下计算出其中一个......但是 gcc 5.3.0 不会玩球。
你肯定需要双牙套。 (一次是说你在初始化一张地图,一次是划定每一个条目。)
std::map
有一个初始化列表构造函数:
map (initializer_list<value_type> il,
const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());
我们可以很容易地使用这个构造函数创建地图:
std::map<double,std::string> m1{{1000.0, s1}};
要在 make_shared
中使用它,我们需要指定我们提供的 initializer_list
的实例化:
auto foo = std::make_shared<std::map<double,std::string>>
(std::initializer_list<std::map<double,std::string>::value_type>{{1000.0, s1}});
看起来真的很笨拙;但是如果你经常需要这个,你可以用别名来整理它:
#include <string>
#include <map>
#include <memory>
std::string s1{"temp"};
using map_ds = std::map<double,std::string>;
using il_ds = std::initializer_list<map_ds::value_type>;
auto foo = std::make_shared<map_ds>(il_ds{{1000.0, s1}});
您可能更愿意定义一个模板函数来包装调用:
#include <string>
#include <map>
#include <memory>
template<class Key, class T>
std::shared_ptr<std::map<Key,T>>
make_shared_map(std::initializer_list<typename std::map<Key,T>::value_type> il)
{
return std::make_shared<std::map<Key,T>>(il);
}
std::string s1{"temp"};
auto foo = make_shared_map<double,std::string>({{1000, s1}});
你可以不用 std::make_shared
:
std::shared_ptr<std::map<double,std::string>> ptr(new std::map<double,std::string>({{1000.0, "string"}}));
我有以下 shared_ptr
到 map
:
std::shared_ptr<std::map<double, std::string>>
并且我想使用 braced-init 来初始化它。可能吗?
我试过:
std::string s1("temp");
std::shared_ptr<std::map<double, std::string>> foo = std::make_shared<std::map<double, std::string>>(1000.0, s1);
但是使用 Xcode 6.3 编译时出现以下错误:
/usr/include/c++/v1/map:853:14: Candidate constructor not viable: no known conversion from 'double' to 'const key_compare' (aka 'const std::__1::less<double>') for 1st argument
我尝试了第一个参数 (1000.0) 的其他变体,但没有成功。
有人能帮忙吗?
类似于此的东西应该可以做到...
std::string s1("temp");
std::map<double, std::string> *m = new std::map<double, std::string>{{100., s1}};
auto foo = std::shared_ptr<std::map<double, std::string>>(m);
或作为单线
auto foo2 = std::shared_ptr<std::map<double, std::string>>(new std::map<double, std::string>{{100., s1}});
(抱歉,第一次错过了初始化列表的要求)
更改密钥类型。
double
是一个不好的键类型,因为它没有 operator==
并且不同的字节序列可以表示相同的浮点值。
你的问题是你实际上没有在你的初始值设定项中放置任何大括号。我需要以下内容才能使其正常工作:
auto foo = std::make_shared<std::map<double, std::string> >(
std::map<double, std::string>({{1000.0, s1}})
);
双重 std::map<double, std::string>
让我很烦。它真的应该能够在给定另一个的情况下计算出其中一个......但是 gcc 5.3.0 不会玩球。
你肯定需要双牙套。 (一次是说你在初始化一张地图,一次是划定每一个条目。)
std::map
有一个初始化列表构造函数:
map (initializer_list<value_type> il,
const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());
我们可以很容易地使用这个构造函数创建地图:
std::map<double,std::string> m1{{1000.0, s1}};
要在 make_shared
中使用它,我们需要指定我们提供的 initializer_list
的实例化:
auto foo = std::make_shared<std::map<double,std::string>>
(std::initializer_list<std::map<double,std::string>::value_type>{{1000.0, s1}});
看起来真的很笨拙;但是如果你经常需要这个,你可以用别名来整理它:
#include <string>
#include <map>
#include <memory>
std::string s1{"temp"};
using map_ds = std::map<double,std::string>;
using il_ds = std::initializer_list<map_ds::value_type>;
auto foo = std::make_shared<map_ds>(il_ds{{1000.0, s1}});
您可能更愿意定义一个模板函数来包装调用:
#include <string>
#include <map>
#include <memory>
template<class Key, class T>
std::shared_ptr<std::map<Key,T>>
make_shared_map(std::initializer_list<typename std::map<Key,T>::value_type> il)
{
return std::make_shared<std::map<Key,T>>(il);
}
std::string s1{"temp"};
auto foo = make_shared_map<double,std::string>({{1000, s1}});
你可以不用 std::make_shared
:
std::shared_ptr<std::map<double,std::string>> ptr(new std::map<double,std::string>({{1000.0, "string"}}));