将具有可变构造函数的对象放置到映射中

emplacing object with variadic constructor into map

本文关键字:映射 对象 构造函数      更新时间:2023-10-16

我有一个可变模板构造函数的可移动(但不可复制)类型

struct foo
{
  std::string a,b,c;
  foo(foo const&)=delete;
  foo(foo&&)=default;
  template<typename...T>
  for(T&&...);
};

我想把它添加到地图中:

template<typename...T>
void add_foo(std::map<std::string,foo>&map, const char*name, T&&...args)
{
  map.emplace(std::piecewise_construct,      // how? perhaps like this?
              std::forward_as_tuple(name),   //   no:
              std::forward_as_tuple(args));  //   error here
}

std::forward_as_tuple()需要一个包,所以您可以简单地使用...:扩展args

map.emplace(std::piecewise_construct,
            std::forward_as_tuple(name),
            std::forward_as_tuple(args...));

您需要解压缩参数:args...

查看Coliru直播

#include <string>
#include <map>
struct foo
{
    std::string a,b,c;
    foo(foo const&)=delete;
    foo(foo&&)=default;
    template<typename...T> foo(T&&...) {}
};

template<typename...T>
void add_foo(std::map<std::string,foo>& map, const char*name, T&&...args)
{
    map.emplace(std::piecewise_construct,      // how? perhaps like this?
            std::forward_as_tuple(name),   //   no:
            std::forward_as_tuple(args...));  //   error here
}
int main()
{
    std::map<std::string,foo> m;
    add_foo(m, "a", "b", "c");
}