c++ - 放置复杂物体

标签 c++ templates c++14 emplace

我正在尝试在对象中实现“放置”功能。它的结构如下。我有一个将 size_t 与模板类型配对的模板对象。我希望能够在标准库容器(例如 vector )中就地构建它。我没有使用 std::pair,因为我的类 B 将围绕数据提供其他功能。

我需要如何修改代码,才能像在 main 中一样调用 emplace?

#include <iostream>                                                                 
#include <vector>                                                                   
using namespace std;                                                                

class C {                                                                           
  public:                                                                           
    C(const string& _s) : s(_s) {}                                                  
    C(string&& _s) : s(_s) {}                                                       

  private:                                                                          
    string s;                                                                       
};                                                                                  

template<typename A>                                                                
class B {                                                                           
  public:                                                                           

    B(size_t _i, const A& _a) : i(_i), a(_a) {}                                     
    B(size_t _i, A&& _a) : i(_i), a(_a) {}                                                  

  private:                                                                          
    size_t i;                                                                       
    A a;                                                                            
};                                                                                  

int main() {                                                                        
  vector<B<C>> v;                                                                   
  v.emplace_back(5, "Hello");                                                       
}

最佳答案

每个参数允许一个用户定义的转换序列,并且您有两个:

  1. const char* --> std::string
  2. std::string --> C

您可以做的是通过实现通用转发构造函数来减少隐式转换的数量:

template<typename A>                                                                
class B {                                                                           
  public:

    template<typename X>
    B(size_t _i, X&& _a) : i(_i), a(std::forward<X>(_a)) {}                                                  

  ...
};

这将生成一个构造函数 B(size_t, const char*) ,它将与 emplace_back(5, "Hello") 完美匹配,只需一次转换即可构造a 来自 const char *

关于c++ - 放置复杂物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47876018/

相关文章:

c++ - 作为模板参数的成员函数和 c++17 等价物

c++ - json 序列化 C++

c++ - DLL-导出模板基类的静态成员

c++ - 使 C++ 类成为监视器(在并发意义上)

c++ - C++14 标准布局类型可以将 `alignas` 用于字段吗?

compiler-errors - cmake/make - 无法识别的命令行选项 "-std=c++14"- 但 G++ 可以

c++ - 复制具有多态内容的 std::unique_ptr 的 std::map

c++ - 我怎样才能在 vector 中有一对引用?

c++ - 函数原型(prototype)

c++ - 将 C++11 代码转换为 C++98